【问题标题】:Python, list of tuples split into dictionariesPython,元组列表拆分成字典
【发布时间】:2019-11-24 11:08:34
【问题描述】:

我有一个元组列表,如图所示:

lt = [(1,'a'),(1,'b'),(2,'a'),(3,'b'),(3,'c')]

我想制作字典的数字键并让它们指向一个列表。然后该列表包含元组列表中的所有关联。所以在上面的列表中,它会分成一个字典:

dict_lt:{
1:[a,b],
2:[a],
3:[b,c]
}

目前我使用字典的灵活性自动声明新键,然后我强制指向一个空列表。然后我相应地填写该列表。

dict_lt = {}

for tup in lt:
   dict_lt[tup[0]] = []

for tup in lt:
   dict_lt[tup[0]].append(tup[1])

这工作正常,但它有点慢,因为它需要在同一个列表上迭代两次,而且它似乎总体上是多余的。有没有更好的办法?

【问题讨论】:

    标签: python list dictionary tuples


    【解决方案1】:

    您不需要重复列表两次。如果key不在字典中,可以使用setdefault()设置初始值:

    lt = [(1,'a'),(1,'b'),(2,'a'),(3,'b'),(3,'c')]
    d = {}
    for k, v in lt:
        d.setdefault(k, []).append(v)
    print(d)
    

    打印

    {1: ['a', 'b'], 2: ['a'], 3: ['b', 'c']}
    

    【讨论】:

      【解决方案2】:

      您可以将collections.defaultdictlist factory 或dict.setdefault 一起使用来创建一个可以附加值的列表。

      collections.defaultdict

      out = collections.defaultdict(list) 
      
      for k, v in lt: 
          out[k].append(v) 
      

      dict.setdefault

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

      示例:

      In [11]: lt = [(1, 'a'),(1, 'b'),(2, 'a'),(3, 'b'),(3, 'c')]                                                                                                                                                
      
      In [12]: out = {}                                                                                                                                                                                           
      
      In [13]: for k, v in lt: 
          ...:     out.setdefault(k, []).append(v) 
          ...:                                                                                                                                                                                                    
      
      In [14]: out                                                                                                                                                                                                
      Out[14]: {1: ['a', 'b'], 2: ['a'], 3: ['b', 'c']}
      
      In [15]: out = collections.defaultdict(list)                                                                                                                                                                
      
      In [16]: for k, v in lt: 
          ...:     out[k].append(v) 
          ...:      
          ...:                                                                                                                                                                                                    
      
      In [17]: out                                                                                                                                                                                                
      Out[17]: defaultdict(list, {1: ['a', 'b'], 2: ['a'], 3: ['b', 'c']})
      

      【讨论】:

      • 关于性能的说明:如果你经常这样做,特别是如果唯一键的数量相对于对的总数来说很小,使用 collections.defaultdict(list)much i> 更好,有两个原因:1)90% 的时间(而这种情况是在 90%),使用方法调用比语法支持的等效操作慢;能够做到d[k]d.get(k)d.setdefault(k, None) 快,只要d[k] 不会提高KeyError。 2)setdefault(k, [])每次都必须创建一个空的list,即使密钥存在; defaultdict 只在需要时创建一个。
      【解决方案3】:

      您可以在代码中使用defaultdict(list) 代替dict,并省略第一个循环。

      from collections import defaultdict
      
      dict_lt = defaultdict(list)
      
      
      for tup in lt:
          dict_lt[tup[0]].append(tup[1])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-19
        • 2014-03-31
        • 2018-05-01
        相关资源
        最近更新 更多