基于子列表中的第一个元素的列表的集群列表

时间:2019-05-15 10:43:31

标签: python

我有python列表列表:

list = [['a', 0], ['a', 1], ['b', 1], ['c', 1], ['c', 3], ['c', 5], ['d', 2]]

我想创建一个包含以相同字母开头的子列表的python字典:

dict{'a':[0,1], 'b':[1], 'c':[1,3,5], 'd':[2]}

您能帮我吗?

2 个答案:

答案 0 :(得分:3)

使用collection.defaultdict

例如:

from collections import defaultdict

lst = [['a', 0], ['a', 1], ['b', 1], ['c', 1], ['c', 3], ['c', 5], ['d', 2]]
result = defaultdict(list)

for m,n in lst:
    result[m].append(n)

print(result)
#defaultdict(<type 'list'>, {'a': [0, 1], 'c': [1, 3, 5], 'b': [1], 'd': [2]})

或使用dict.setdefault

例如:

result = {}
for m,n in lst:
    result.setdefault(m, []).append(n)

print(result)
#{'a': [0, 1], 'c': [1, 3, 5], 'b': [1], 'd': [2]}

答案 1 :(得分:1)

使用defaultdict

from collections import defaultdict

l = [['a', 0], ['a', 1], ['b', 1], ['c', 1], ['c', 3], ['c', 5], ['d', 2]]

d = defaultdict(list)
for i in l:
    d[i[0]].append(i[1])

print(d)
# defaultdict(list, {'a': [0, 1], 'b': [1], 'c': [1, 3, 5], 'd': [2]})

或者,如果子列表按照第一个元素排序,那么您也可以使用itertools.groupby

from itertools import groupby
from operator import itemgetter

{k:[i[1] for i in v] for k,v in groupby(l, key=itemgetter(0))}
# {'a': [0, 1], 'b': [1], 'c': [1, 3, 5], 'd': [2]}