Il LC appropriata sarebbe
[entry for tag in tags for entry in entries if tag in entry]
L'ordine delle anse della LC è simile a quelle in cicli annidati, il if andare alla fine e le espressioni condizionali vanno in principio, qualcosa come
[a if a else b for a in sequence]
vedere la demo -
>>> tags = [u'man', u'you', u'are', u'awesome']
>>> entries = [[u'man', u'thats'],[ u'right',u'awesome']]
>>> [entry for tag in tags for entry in entries if tag in entry]
[[u'man', u'thats'], [u'right', u'awesome']]
>>> result = []
for tag in tags:
for entry in entries:
if tag in entry:
result.append(entry)
>>> result
[[u'man', u'thats'], [u'right', u'awesome']]
EDIT - Poiché è necessario che il risultato sia appiattito, è possibile utilizzare un elenco simile per comprendere e quindi appiattire i risultati.
>>> result = [entry for tag in tags for entry in entries if tag in entry]
>>> from itertools import chain
>>> list(chain.from_iterable(result))
[u'man', u'thats', u'right', u'awesome']
L'aggiunta di questo insieme, si può solo fare
>>> list(chain.from_iterable(entry for tag in tags for entry in entries if tag in entry))
[u'man', u'thats', u'right', u'awesome']
si utilizza un generatore di espressione qui invece di una lista di comprensione. (Corrisponde perfettamente il limite di 79 caratteri troppo (senza la chiamata list
))
Usa 'itertools.chain' se volete un elenco appiattito:' lista (catena .from_iterable (voce per tag nei tag per l'immissione nelle voci se tag in entrata)) ' –