我试图用两个字典的交集来做一个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)
答案 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是估算算法复杂性的一种方法。我把你和一个好的初学者指南联系起来;不幸的是,维基百科文章很难阅读。