Python中两个字典的交集

2024-05-08 21:21:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究一个反向索引的搜索程序。索引本身是一个字典,其键是术语,其值本身是短文档的字典,ID号是键,其文本内容是值。

因此,要对两个词执行“和”搜索,我需要将它们的帖子列表(词典)相交。在Python中,有什么方法可以做到这一点(不一定过于聪明)?我一开始就用iter做了很长的尝试:

p1 = index[term1]  
p2 = index[term2]
i1 = iter(p1)
i2 = iter(p2)
while ...  # not sure of the 'iter != end 'syntax in this case
...

Tags: 方法文档文本程序id内容列表index
3条回答

一个鲜为人知的事实是,您不需要构造set来执行此操作:

在Python 2中:

In [78]: d1 = {'a': 1, 'b': 2}

In [79]: d2 = {'b': 2, 'c': 3}

In [80]: d1.viewkeys() & d2.viewkeys()
Out[80]: {'b'}

在Python 3中,用keys替换viewkeys;这同样适用于viewvaluesviewitems

viewitems的文档中:

In [113]: d1.viewitems??
Type:       builtin_function_or_method
String Form:<built-in method viewitems of dict object at 0x64a61b0>
Docstring:  D.viewitems() -> a set-like object providing a view on D's items

对于较大的dicts,这也比构造sets并与它们相交稍快:

In [122]: d1 = {i: rand() for i in range(10000)}

In [123]: d2 = {i: rand() for i in range(10000)}

In [124]: timeit d1.viewkeys() & d2.viewkeys()
1000 loops, best of 3: 714 µs per loop

In [125]: %%timeit
s1 = set(d1)
s2 = set(d2)
res = s1 & s2

1000 loops, best of 3: 805 µs per loop

For smaller `dict`s `set` construction is faster:

In [126]: d1 = {'a': 1, 'b': 2}

In [127]: d2 = {'b': 2, 'c': 3}

In [128]: timeit d1.viewkeys() & d2.viewkeys()
1000000 loops, best of 3: 591 ns per loop

In [129]: %%timeit
s1 = set(d1)
s2 = set(d2)
res = s1 & s2

1000000 loops, best of 3: 477 ns per loop

我们在这里比较纳秒,这对你来说可能重要,也可能不重要。在任何情况下,都会返回一个set,因此使用viewkeys/keys可以消除一点混乱。

可以方便地计算集合的交集,因此可以从关键点创建集合并将它们用于交集:

keys_a = set(dict_a.keys())
keys_b = set(dict_b.keys())
intersection = keys_a & keys_b # '&' operator is used for set intersection
In [1]: d1 = {'a':1, 'b':4, 'f':3}

In [2]: d2 = {'a':1, 'b':4, 'd':2}

In [3]: d = {x:d1[x] for x in d1 if x in d2}

In [4]: d
Out[4]: {'a': 1, 'b': 4}

相关问题 更多 >