un fatto poco noto è che non c'è bisogno di costruire set
s per farlo:
In 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'}
In Python 3 sostituire viewkeys
con keys
; lo stesso vale per viewvalues
e viewitems
.
Dalla documentazione di 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
Per maggiore dict
s questo anche un po 'più veloce di costruire set
s e poi li si intersecano:
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
Stiamo confrontando nanosecondi qui, che può o potrebbe non avere importanza per te. In ogni caso, si ottiene un set
, quindi utilizzando viewkeys
/keys
si elimina un po 'di confusione.
fonte
2013-09-01 00:25:56
{i: dict (p1 [i], * * p2 [i]) per i in p1 se io in p2} – mtadd
Il mio commento sopra intersecherà i dizionari dei termini, ma unione-unisci i tuoi elenchi di post .... se vuoi anche intersecare i tuoi elenchi di post sui tuoi numeri di ID documento , puoi usare '{term: {doc_id: p1 [term] [doc_id] per doc_id in p1 [term] se doc_id in p2 [term]} per termine in p1 se termine in p2}' – mtadd