我有itemList
格式的(key, value)
序列,我希望将该列表中的项目转换为格式为dict
的{{1}}。具有匹配或新{key : [value, ..], ..}
的{{1}}可能会多次显示特定的key
值,我也想记录这些值(这就是为什么只使用itemList
不行。)。
我正在使用value
并寻找使这段代码小型化的方法:
dict(itemList)
我尝试将Python2.7.9
和newDict = 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的内置插件和模块作为学术练习而不是故意避免某些功能性和可理解性。)
答案 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))