2012-07-31 77 views
0

我有我想要的值添加到特定列表列表的字典的字典...追加元素到最小列表中列出

d = {'a': [4, 2], 'b': [3, 4], 'c': [4, 3], 'd': [4, 3], 'e': [4], 'f': [4], 'g': [4]} 

我想2號添加到剛其中一個長度最小的列表。

def gsl(x): 
    return [k for k in x.keys() if len(x.get(k))==min([len(n) for n in x.values()])] 

調用

>>> gsl(d) 
['e', 'g', 'f'] 

因此,在這種情況下後,我想2號添加到列表'e'在字典使其[4,2](順序並不重要。

結果應該是我想試試

for i in d: 
    if gsl(d)[0] == i: #gets the first key with the smallest value 
     d[i].append(2) # if equal, adds 2 to the dictionary value that matches 

除了增加2每個'e''g''f'

在此先感謝!

+0

嘗試殺死for循環,看看是否有幫助 – inspectorG4dget 2012-07-31 00:32:29

回答

4
>>> d = {'a': [4, 2], 'b': [3, 4], 'c': [4, 3], 'd': [4, 3], 'e': [4], 'f': [4], 'g': [4]} 
>>> smallest = min(d, key=lambda k: len(d[k])) 
>>> d[smallest].append(2) 
>>> d 
{'a': [4, 2], 'c': [4, 3], 'b': [3, 4], 'e': [4, 2], 'd': [4, 3], 'g': [4], 'f': [4]} 
+0

如果我想獲得第二小的列表,該怎麼辦?所以不是最小的一個,但是在 – user1530318 2012-08-02 21:18:43

+1

@ user1530318'heapq'之後的那個不會是最後一個:)。>>> >>> from >>> hello :len(d [k]))[ - 1]' ''g'' – jamylak 2012-08-02 21:32:25

+0

甜,那有效!所以,現在,我返回第二小的數字。如果我想做一些事情,比如嘿,找到最小的名單,如果它有一個特定的單詞,讓我們說「約翰」,那麼只能附加這個數字。否則,找到下一個最小的列表直到發生。使用heapq來做到這一點的最好方法可能是通過遞歸函數嗎? – user1530318 2012-08-03 15:35:54

0

如何:

d[gsl(d)[0]].append(2) 

gsl(d)獲取密鑰列表中以最小的長度,0獲取第一個,然後我們得到的名單在這個關鍵和追加2它。

0

與你的答案的問題是,在「E」插入元素之後,就不再「有最小長度列表鍵」的一部分,因此下一次迭代將返回['F ', 'G']。

一個快速解決它打破循環,就像這樣:

for i in d: 
    if gsl(d)[0] == i: 
     d[i].append(2) 
     break 

但是,這是在做你想要什麼的非常低效的方式,如果d爲空,將失敗。

0

如果你正在使用Python 2.7或更新版本,你可以使用這個view:如果您使用的是舊版本

>>> d = {'a': [4, 2], 'b': [3, 4], 'c': [4, 3], 'd': [4, 3], 'e': [4], 'f': [4], 'g': [4]} 
>>> min(d.viewitems(), key=lambda (k, v): len(v))[1].append(2) 
>>> d 
{'a': [4, 2], 'c': [4, 3], 'b': [3, 4], 'e': [4, 2], 'd': [4, 3], 'g': [4], 'f': [4]} 

,您可以使用iteritems

>>> d = {'a': [4, 2], 'b': [3, 4], 'c': [4, 3], 'd': [4, 3], 'e': [4], 'f': [4], 'g': [4]} 
>>> min(d.iteritems(), key=lambda (k, v): len(v))[1].append(2) 
>>> d 
{'a': [4, 2], 'c': [4, 3], 'b': [3, 4], 'e': [4, 2], 'd': [4, 3], 'g': [4], 'f': [4]} 
+0

其實'dict.viewitems'只是python 2.7。在python 3中,它是'dict.items'方法的默認行爲。你的第二種方法是我最初使用的,但我認爲我目前的解決方案看起來更好:)另外我最近發現,函數中的元組解包('lambda(k,v)')在Python 3中被刪除,因此我決定停止使用它從現在開始。 – jamylak 2012-08-01 06:05:30