有没有更简洁的方法将(key,value)元组序列转换成{key:[value,…],…}dict?

2024-06-17 11:57:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个格式为(key, value)的元组序列itemList,我想将该列表中的项转换为dict,格式为{key : [value, ..], ..}。一个特定的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()list-comprehensionsnewDict.update(..)结合使用,但是没有一个能达到预期效果。在

我已经看过this similar question,,但是我的输入和期望的输出的格式有很大的不同。在

(对于那些想知道的人,“为什么要更改这个完全可以接受的代码?”:我感兴趣的是寻找其他方法来应用Python的内置组件和模块,而不是有意地避免一些功能性和可理解的东西。)


Tags: 方法key代码in列表value格式记录
2条回答

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

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

您可以使用^{}来缩短代码,如下所示

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

setdefault将在字典中查找键,如果找不到它,它将为它分配第二个参数并返回它。在

如果在字典中找到了键,它将简单地返回相应的值。在


或者,可以使用^{},如下所示

^{pr2}$

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

相关问题 更多 >