mało znany jest fakt, że nie trzeba konstruować set
y do tego celu:
W Pythonie 2:
In [78]: d1 = {'a': 1, 'b': 2}
In [79]: d2 = {'b': 2, 'c': 3}
In [80]: d1.viewkeys() & d2.viewkeys()
Out[80]: {'b'}
W Pythonie 3 zastąpić viewkeys
z keys
; to samo dotyczy viewvalues
i .
Z dokumentacji 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
Dla większych dict
s to także nieco szybciej niż konstruowanie set
s, a następnie przecinających je:
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
Mamy tu porównanie nanosekund, co może lub może nie mieć dla ciebie znaczenia. W każdym razie, odzyskujesz set
, więc używanie viewkeys
/keys
eliminuje trochę bałaganu.
{i: dict (p1 [i], * * p2 [i]) dla i w p1, jeśli w p2} – mtadd
Mój powyższy komentarz przetnie słowniki terminów, ale zrewolucjonizuje twoje listy wpisów ... jeśli chcesz również przeciąć listy wysyłkowe na swoich numerach identyfikacyjnych dokumentów , możesz użyć '{term: {doc_id: p1 [wyrażenie] [doc_id] dla id_ed w p1 [wyrażenie] jeśli doc_id w p2 [wyrażenie]} dla terminu w p1, jeśli termin w p2}' – mtadd