Skip to main content
 首页 » 编程设计

python - 在 Python 中组合列表的字典

2023年05月26日14dyllove98

我有一个非常大的 (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]}   

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

提前致谢

请您参考如下方法:

如果对元组列表进行排序,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 

因为这仅对重叠键使用列表连接——所以,如果这些键很少,它会更快。