首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python中组合列表的字典

在Python中组合列表的字典
EN

Stack Overflow用户
提问于 2018-09-27 06:16:38
回答 2查看 0关注 0票数 0

我有一个非常大的(p,q)元组集合,我想将其转换为列表字典,其中每个元组中的第一项是索引包含q的列表的键。

例:

代码语言:javascript
复制
Original List: (1, 2), (1, 3), (2, 3)  
Resultant Dictionary: {1:[2, 3], 2:[3]}  

此外,我想有效地结合这些词典。

例:

代码语言:javascript
复制
Original Dictionaries: {1:[2, 3], 2:[3]}, {1:[4], 3:[1]}  
Resultant Dictionary: {1:[2, 3, 4], 2:[3], 3:[1]}  

这些操作位于内部循环中,因此我希望它们尽可能快。

提前致谢

EN

回答 2

Stack Overflow用户

发布于 2018-09-27 15:05:09

如果按照itertools.groupby对元组列表进行排序,则它不是一个糟糕的替代方案defaultdict,但需要使用与他建议的不同的方式:

代码语言:javascript
复制
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)

将列表的“合并”列入新的数据库中:

代码语言:javascript
复制
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'键的集合只是适度重叠,则更快:

代码语言:javascript
复制
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 - 所以,如果这些很少,它会更快。

票数 0
EN

Stack Overflow用户

发布于 2018-09-27 15:23:31

collections.defaultdict 像这样工作:

代码语言:javascript
复制
from collections import defaultdict
dic = defaultdict(list)
for i, j in tuples:
    dic[i].append(j)

类似于dicts:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100002772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档