2012-10-10 58 views
3

我有一個超過1000個鍵的巨大字典,每個值都超過600 000 int long。現在,我需要提取其中的一些整數,所以從60萬我想要去說5K。但它不能隨機5k,他們必須在非常特定的位置。由於5k仍然有點太大而無法手動提取,所以我需要使用一個索引列表來指示值中的哪些整數應該被取出。 我測試了小列表上的提取,索引[1,3,5,7,9]和long_val ['a','b','c','d','e','f',' G」, 'H', 'I', 'J', 'K']然後我可以這樣做:在python詞典中編輯值

for each in xrange(len(long_val)): 
    print indices[long_val[each]] 

,我得到b,d,F,H和J(根據需要)。

現在,處理字典(其中long_val被替換爲實際的字典值)並不那麼簡單。我曾嘗試過:

for keys,values in dict_gtps.iteritems(): 
    for each in xrange(len(values)): 
     abs_new[keys]=pos_3[values[each]] 

但我得到「索引超出範圍」的錯誤消息。

回答

3

假設我正確地閱讀了您的要求,您可以嘗試:

for key, value in dict_gtps.iteritems(): 
    abs_new[key] = [value[i] for i in indices] 
+0

簡單易用且可以正常工作!謝謝!! – branwen85

+0

不客氣。 –

5

如果您使用的是相同的指標,這將是更有效地使用itemgetter(*indices)

>>> from operator import itemgetter 
>>> indices =  [1,3,5,7,9] 
>>> long_val = ['a','b','c','d','e','f','g','h','i','j','k']  
>>> ig = itemgetter(*indices) 
>>> ig(long_val) 
('b', 'd', 'f', 'h', 'j') 

所以

from operator import itemgetter 
ig = itemgetter(*indices) 
for k, v in dict_gtps.iteritems(): 
    print ig(v) 
    abs_new[k] = ig(v) 

你也可以使用字典理解

abs_new = {k:ig(v) for k,v in dict_gtps.iteritems()} 
+0

有用,謝謝! – branwen85

+0

Ooo .. +1爲詞典理解變體。 –

+0

itemgetter比列表理解稍有用處,因爲它將新值放入一個元組中,我更願意將它們放在列表中。 – branwen85

1

您的示例代碼存在缺陷,索引和long_val將其值顛倒過來。

indices = [1,3,5,7,9] 
long_val = ['a','b','c','d','e','f','g','h','i','j','k'] 
for each in xrange(len(long_val)): 
    print indices[long_val[each]] 

拋出TypeError。它應該是:

indices = [1,3,5,7,9] 
long_val = ['a','b','c','d','e','f','g','h','i','j','k'] 
for each in xrange(len(indices)): 
    print long_val[indices[each]] 

此基礎上,它應該是很明顯的,爲什麼你的字典函數拋出了一系列的錯誤,你就會把錯誤的變量。我會讓你試着自己修改代碼。

爲後人 也

/編輯,因爲指數的值是整數,你實際上並不需要使用xrange--

for i in indices: 
    print long_val[i] 

簡單得多。

+0

謝謝!我實際上稱爲變量a和b,然後混合起來,這是什麼... – branwen85

+0

@ user1735184我添加了原始函數的簡化。您可能需要在最終代碼中對此進行迭代。 – kreativitea