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

结果应该是

>>> 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

4 回答 4

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]}
于 2012-07-31T00:32:08.810 回答
0

怎么样:

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

gsl(d)获取具有最小长度的键列表,0获取第一个,然后我们获取该键的列表并附2加到它。

于 2012-07-31T00:31:00.293 回答
0

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

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

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

但这是一种非常低效的方法,如果 d 为空,则会失败。

于 2012-07-31T00:36:15.470 回答
0

如果您使用的是 python 2.7 或更高版本,则可以为此使用视图:

>>> 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]}
于 2012-07-31T04:56:24.313 回答