我有一个非常大的(p,q)元组集合,我想将其转换为列表字典,其中每个元组中的第一项是索引包含q的列表的键。
示例:
Original List: (1, 2), (1, 3), (2, 3)
Resultant Dictionary: {1:[2, 3], 2:[3]}
此外,我想有效地结合这些词典。
示例:
Original Dictionaries: {1:[2, 3], 2:[3]}, {1:[4], 3:[1]}
Resultant Dictionary: {1:[2, 3, 4], 2:[3], 3:[1]}
这些操作位于内部循环中,因此我希望它们尽可能快。
提前致谢
答案 0 :(得分:15)
如果元组列表已排序,itertools.groupby
(由@gnibbler建议)不是defaultdict
的替代方案,但需要使用与他建议不同的方式:
import itertools
import operator
def lot_to_dict(lot):
key = operator.itemgetter(0)
# if lot's not sorted, you also need...:
# lot = sorted(lot, key=key)
# NOT in-place lot.sort to avoid changing it!
grob = itertools.groupby(lot, key)
return dict((k, [v[1] for v in itr]) for k, itr in grob)
将列表的“合并”列入新的d.o.l ......:
def merge_dols(dol1, dol2):
keys = set(dol1).union(dol2)
no = []
return dict((k, dol1.get(k, no) + dol2.get(k, no)) for k in keys)
我给[]
一个昵称no
,以避免无用地构建大量空列表,因为性能很重要。如果dols'键的集合仅适度重叠,则更快:
def merge_dols(dol1, dol2):
result = dict(dol1, **dol2)
result.update((k, dol1[k] + dol2[k])
for k in set(dol1).intersection(dol2))
return result
因为它仅对重叠键使用list-catenation - 所以,如果那些很少,它会更快。
答案 1 :(得分:4)
collections.defaultdict
的工作原理如下:
from collections import defaultdict
dic = defaultdict(list)
for i, j in tuples:
dic[i].append(j)
类似于dicts:
a, b = {1:[2, 3], 2:[3]}, {1:[4], 3:[1]}
de = defaultdict(list, a)
for i, j in b.items():
de[i].extend(j)
答案 2 :(得分:3)
诽谤拯救(像往常一样)
from collections import defaultdict
my_dict = defaultdict(list)
for key,value in original_list:
my_dict[key].append(value)
组合两个dicts可以像这样完成(请注意,将保留重复项):
for key,value in orig_dict:
new_dict[key].extend(value)
答案 3 :(得分:0)
这是迭代器的做法
>>> mylist=[(1, 2), (1, 3), (2, 3)] >>> from itertools import groupby >>> from operator import itemgetter >>> mylist=[(1, 2), (1, 3), (2, 3)] >>> groupby(mylist,itemgetter(0)) >>> list(_) [(1, <itertools._grouper object at 0xb7d402ec>), (2, <itertools._grouper object at 0xb7c716ec>)]
答案 4 :(得分:0)
我想在一行中完成这些只是为了好玩:
>>> from itertools import groupby
>>> t=(1, 2), (1, 3), (2, 3)
>>> [(i,[x for _,x in list(f)]) for i,f in groupby(sorted(t),lambda t: t[0])]
[(1, [2, 3]), (2, [3])]
>>> b={1:[2, 3], 2:[3]}, {1:[4], 3:[1]}
>>> dict([(key,sum([i[1::][0] for i in elements],[])) for key,elements in groupby(sorted(b[0].items()+b[1].items()),lambda t: t[0])])
{1: [2, 3, 4], 2: [3], 3: [1]}