python词典中值之间的交叉(更快的方式)

时间:2017-04-13 16:11:51

标签: python dictionary

我试图用两个字典的交集来做一个txt文件。我正在搜索,我知道最好的方法是使用密钥交叉,但是我的字典我不能这样做。

我的词典示例:

dA = {'1':'aaa','2':'aaa','3':'bbb'}
dB = {'10':'aaa','11':'aaa','12':'bbb'}

这是我在txt文件中需要的输出:

1 10
1 11
2 10
2 11
3 12

注意:我的词典每个都有〜100.000.000个词条

这是我的代码:

>>> for key, value in da.items():
...     for bkey, bvalue in db.items():
...             if bvalue == value:
...                     print(key, bkey)

1 个答案:

答案 0 :(得分:4)

一种更快的方法,可生成未排序的输出。

from itertools import product
from collections import defaultdict

da = {'1':'aaa','2':'aaa','3':'bbb'}
db = {'10':'aaa','11':'aaa','12':'bbb'}

def gen_matches():
  map_a = defaultdict(list)
  map_b = defaultdict(list)

  for key, value in da.items():
    map_a[value].append(key)
  for key, value in db.items():
    map_b[value].append(key)

  for key in map_a:
    if key in map_b:
      for x in product(map_a[key], map_b[key]):
        yield x

for match in gen_matches():
  print(match)

<强>输出

('2', '11')
('2', '10')
('1', '11')
('1', '10')
('3', '12')

这是O(n + m),这意味着它只需要一次查看每个字典中的每个元素。我们称字典A“n”的大小和字典B“m”的大小。

原始方法是O(n * m)。每次查看A的元素时,都会在B中查看每个其他元素

因此,您可以通过替换数字来了解这两种方法需要多长时间。如果dicts A和B都包含1000个元素,那么这个版本将需要大约2000个时间单位,而原始版本需要1,000,000个!。

Big-O notation估算算法复杂性的一种方法。我把你和一个好的初学者指南联系起来;不幸的是,维基百科文章很难阅读。