将元素追加到列表字典中的最小列表

时间:2012-07-31 00:28:01

标签: python list dictionary

我有一个列表字典,我想为特定列表添加一个值...

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](顺序无关紧要。

结果应为

>>> d['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'之外。

提前致谢!

4 个答案:

答案 0 :(得分: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]}

答案 1 :(得分:0)

怎么样:

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

gsl(d)获取最小长度的密钥列表,0获取第一个密钥,然后我们获取该密钥的列表并将2附加到其中。

答案 2 :(得分:0)

你的答案的问题在于,在'e'中插入元素后,它不再是“具有最小长度列表的键”的一部分,因此在下一次迭代中它将返回['f','g “]。

一个快速解决方法是打破循环,如下所示:

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

但这是一种非常低效的方式来做你想做的事情,如果d为空则会失败。

答案 3 :(得分: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]}