【问题标题】:How do I turn a list of tuples into a dictionary while keeping redundant values?如何在保留冗余值的同时将元组列表转换为字典?
【发布时间】:2012-04-08 02:33:21
【问题描述】:

我得到了一个格式化为键值对列表的数据集。键是数据源,值是数据元素。例如:

[('a', 3), ('b', 5), ('a', 7), ('c', 15), ('d', 12)]

我想把这个列表变成字典。我可以使用 Python 的内置 dict(),但它会丢弃冗余值并仅保留与给定键关联的最后一个值。我希望将多余的值放入一个列表中,如下所示:

{'a': [3, 7],
'b': [5],
'c': [15],
'd': [12]}

有没有一种简单的方法来完成上述操作?我认为必须有,但我似乎无法通过 Google 找到正确的提示。

【问题讨论】:

    标签: python list dictionary tuples


    【解决方案1】:
    from collections import defaultdict
    l = [('a', 3), ('b', 5), ('a', 7), ('c', 15), ('d', 12)]
    d = defaultdict(list)
    for k, v in l:
        d[k].append(v)
    print d
    

    在此处查看第一个示例:http://docs.python.org/release/2.5.2/lib/defaultdict-examples.html

    【讨论】:

      【解决方案2】:

      collections 模块中的dict 子类defaultdict 可用于在您第一次访问每个键时自动为每个键初始化一个新的list

      使用它,您只需遍历输入对并将每个值附加到相应键的list 即可生成所需的值列表。

      import collections    
      
      data = [('a', 3), ('b', 5), ('a', 7), ('c', 15), ('d', 12)]
      result = collections.defaultdict(list)
      
      for key, value in data:
          result[key].append(value)
      
      print result
      
      defaultdict(<type 'list'>, {'a': [3, 7], 'c': [15], 'b': [5], 'd': [12]})
      
      print result['a']
      
      [3, 7]
      
      print result['z']
      
      []
      

      【讨论】:

      • 酷。直到今天我才知道defaultdict。我的 python 工具箱中的另一个扳手!
      【解决方案3】:

      喜欢这样吗?

       >>> d=[('a', 3), ('b', 5), ('a', 7), ('c', 15), ('d', 12)]
       >>> f={}
       >>> for k,v in d:
       ...     f[k]=f.get(k,[])+[v]
       ... 
       >>> f
       {'a': [3, 7], 'c': [15], 'b': [5], 'd': [12]}
      

      【讨论】:

      • f.setdefault(k,[]).append(v) 会比 f[k]=f.get(k,[])+[v] 更直接
      • 同意,不过它们几乎是等价的。
      • @StevenRumbalski:使用setdefault() 的主要优点是它不会使代码变成 O(n^2)。
      • @user999346:不,它们不相等。 setdefault() 方式在创建列表后重用列表,而您的方法在每次附加项目时将所有项目复制到新列表。
      • @user999346:将列表添加到列表会创建一个新列表,然后将其分配回字典。随着存储在列表中的值数量的增加,这将变得非常低效。
      【解决方案4】:

      werkzeugpaste 都提供多字典实现。选择一个,然后使用它。

      【讨论】:

        【解决方案5】:
        def multidict(lst):
            result = collections.defaultdict(list)
            for key, value in lst:
                result[key].append(value)
            return result # or dict(result) if you don't want to keep defaultdict
        

        【讨论】:

          【解决方案6】:

          你可以使用字典的setdefault()方法:

          d = {}
          for key, value in my_list:
              d.setdefault(key, []).append(value)
          

          这也可以通过defaultdict 来完成。这两个选项中的哪一个更可取取决于d 在其余代码中的使用方式。 defaultdict 永远不会给您KeyError,因此它可能会在代码中进一步隐藏错误。

          【讨论】:

            猜你喜欢
            • 2020-01-17
            • 2013-03-30
            • 2016-03-21
            • 2011-09-29
            • 2017-09-20
            • 2010-10-15
            • 2019-04-17
            • 1970-01-01
            相关资源
            最近更新 更多