将元组列表转换为字典

43
我有一个像这样的元组列表:
[
('a', 1),
('a', 2),
('a', 3),
('b', 1),
('b', 2),
('c', 1),
]

我想通过使用第一个项目进行迭代,例如,我可以打印类似以下的内容:

a 1 2 3
b 1 2
c 1

如果我想在循环元组时不保留项目以跟踪第一个项目是否相同,该怎么办?这感觉有点混乱(而且我必须首先对列表进行排序)…

5个回答

48
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]}

39

稍微简单一点...

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]})

2
在这种情况下,defaultdict 绝对是最好的选择。实际上,如果您查看文档中的示例,它与此问题非常相似 - http://docs.python.org/library/collections.html#defaultdict-examples - Aaron Newton

11

使用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)], ...]

4
你应该提到需要一个排序后的列表(或者使用groupby(sorted(l),.. ))才能让这段代码工作。虽然给出的数据看起来已经排序了,但问题中提到了“(而且我必须首先对列表进行排序)...”,所以我不确定你是否可以依赖于此。 - Brian

3

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

这个答案基于@gommen的答案

#!/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

3

我只会做基本操作。

答案 = {}
对于键,值 in 元组列表:
  如果键在答案中:
    答案[键].append(值)
  否则:
    答案[键] = [值]

如果这么简短,为什么要用复杂的东西呢。当然,如果你不介意使用setdefault也可以。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接