【问题标题】:Converting a list of tuples into a dict将元组列表转换为字典
【发布时间】:2010-09-20 16:07:28
【问题描述】:

我有一个这样的元组列表:

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

我想通过第一项来遍历这个键控,因此,例如,我可以打印如下内容:

a 1 2 3
b 1 2
c 1

如果不保留一个项目来跟踪第一个项目是否与我围绕元组循环的相同,我将如何执行此操作?这感觉相当混乱(而且我必须先对列表进行排序)......

【问题讨论】:

    标签: python list dictionary tuples iteration


    【解决方案1】:
    l = [
    ('a', 1),
    ('a', 2),
    ('a', 3),
    ('b', 1),
    ('b', 2),
    ('c', 1),
    ]
    
    d = {}
    for x, y in l:
        d.setdefault(x, []).append(y)
    print d
    

    产生:

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

    【讨论】:

      【解决方案2】:

      稍微简单一点...

      from collections import defaultdict
      
      fq = defaultdict(list)
      for n, v in myList:
          fq[n].append(v)
          
      print(fq) # defaultdict(<type 'list'>, {'a': [1, 2, 3], 'c': [1], 'b': [1, 2]})
      

      【讨论】:

      【解决方案3】:

      使用 groupby 的解决方案

          >>> from itertools import groupby
          >>> l = [('a',1), ('a', 2),('a', 3),('b', 1),('b', 2),('c', 1),]
          >>> [(label, [v for l,v in value]) for (label, value) in groupby(l, lambda x:x[0])]
          [('a', [1, 2, 3]), ('b', [1, 2]), ('c', [1])]
      

      groupby(l, lambda x:x[0]) 给你一个迭代器,它包含 ['a', [('a', 1), ...], c, [('c', 1) ], ...]

      【讨论】:

      • 您可能应该提到您需要一个排序列表(或使用 groupby(sorted(l),.. ) 才能工作。给出的数据看起来已排序,但问题提到“(加上我必须对列表进行排序以开始)......”所以我不确定你是否可以依赖这个。
      【解决方案4】:

      我只会做基本的

      答案 = {} 对于 list_of_tuples 中的键、值: 如果键入答案: 答案[key].append(value) 别的: 答案[键] = [值]

      如果它这么短,为什么要使用复杂的东西。当然如果你不介意使用 setdefault 也没关系。

      【讨论】:

        【解决方案5】:

        打印按第一项分组的元组列表

        此答案基于the @gommen one

        #!/usr/bin/env python
        
        from itertools import groupby
        from operator  import itemgetter
        
        L = [
        ('a', 1),
        ('a', 2),
        ('a', 3),
        ('b', 1),
        ('b', 2),
        ('c', 1),
        ]
        
        key = itemgetter(0)
        L.sort(key=key) #NOTE: use `L.sort()` if you'd like second items to be sorted too
        for k, group in groupby(L, key=key):
            print k, ' '.join(str(item[1]) for item in group)
        

        输出:

        a 1 2 3
        b 1 2
        c 1
        

        【讨论】:

          猜你喜欢
          • 2013-04-01
          • 1970-01-01
          • 2017-06-07
          • 2020-12-08
          相关资源
          最近更新 更多