是否有更紧凑的方法将(键,值)元组序列转换为{key:[value,..],..} dict?

时间:2015-05-13 06:02:28

标签: python python-2.7 dictionary key-value

我有itemList格式的(key, value)序列,我希望将该列表中的项目转换为格式为dict的{​​{1}}。具有匹配或新{key : [value, ..], ..}的{​​{1}}可能会多次显示特定的key值,我也想记录这些值(这就是为什么只使用itemList不行。)。

我正在使用value并寻找使这段代码小型化的方法:

dict(itemList)

我尝试将Python2.7.9newDict = dict() for k,v in itemList: # itemList contains the tuples described above. if k in newDict: newDict[k].append(v) else: newDict[k] = [v] map()结合使用,但没有一个按计划进行。

我看过this similar question,,但输入和所需输出的格式有很大不同。

(对于那些想知道的人,“你为什么要改变这个完全可以接受的代码?”:我有兴趣寻找替代方法来应用Python的内置插件和模块作为学术练习而不是故意避免某些功能性和可理解性。)

2 个答案:

答案 0 :(得分:4)

您可以使用dict.setdefault缩短代码,例如

newDict = {}
for k, v in itemList:
    newDict.setdefault(k, []).append(v)

setdefault将在字典中查找密钥,如果未找到,则会为其分配第二个参数并将其返回。

如果在字典中找到了密钥,它将只返回相应的值。

或者,您可以使用collections.defaultdict,就像这样

from collections import defaultdict

result = defaultdict(list)
for k, v in itemList:
    result[k].append(v)

这类似于setdefault方法。如果在字典中找不到密钥,则将调用传递给defaultdict构造函数的函数来创建新值。

答案 1 :(得分:0)

这一行可以替换发布的代码,但是相当难以阅读。它也可能不是很快,因为它必须多次迭代itemList

newDict = dict((k, [_v for _k,_v in itemList if _k == k]) for k in set(i[0] for i in itemList))