【问题标题】:Is there a more compact way to convert a sequence of (key,value) tuples into a {key:[value,..],..} dict?是否有更紧凑的方法将 (key,value) 元组序列转换为 {key:[value,..],..} 字典?
【发布时间】:2015-07-24 06:26:40
【问题描述】:

我有一个itemList 格式的元组序列(key, value),我想将该列表中的项目转换为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 内置和模块的替代方法作为学术练习,而不是故意避免一些功能性和可理解的东西。)

【问题讨论】:

    标签: python python-2.7 dictionary key-value


    【解决方案1】:

    你可以使用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构造函数的函数来创建一个新值。

    【讨论】:

    • 这些方法真的很有趣!我以前用过dict.get(SomeThing, dict()),但我没有注意到setdefault! +1 我也应该看看collections,因为我经常看到它,但已经推迟了一段时间......
    【解决方案2】:

    这行代码可以代替贴出的代码,但阅读起来要困难得多。它也可能不是很快,因为它必须多次遍历itemList

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

    【讨论】:

    • 这具有二次运行时复杂性。如果itemList 很大,它会变得非常低效。
    • @thefourtheye 我认为在另一个迭代器中运行列表理解会很费力,是的......这只是我找到的一个解决方案。诚然,它不是一个好的替代品。 XD
    • @thefourtheye 这个修订版只迭代唯一的itemList 键(在找到它们之后),而不是每个itemList 项。这不是很好,但已经好多了。
    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 2019-08-08
    • 2015-03-22
    • 2020-07-21
    • 2021-03-17
    相关资源
    最近更新 更多