J'ai deux listes comme ci-dessous
tags = [u'man', u'you', u'are', u'awesome']
entries = [[u'man', u'thats'],[ u'right',u'awesome']]
Je souhaite extraire les entrées de entries
leur emplacement tags
:
result = []
for tag in tags:
for entry in entries:
if tag in entry:
result.extend(entry)
Comment puis-je écrire les deux boucles en une seule ligne de compréhension de liste?
python
list
for-loop
list-comprehension
Shiva Krishna Bavandla
la source
la source
itertools.chain
si vous voulez une liste aplatie:list(chain.from_iterable(entry for tag in tags for entry in entries if tag in entry))
Réponses:
Cela devrait le faire:
la source
La meilleure façon de s'en souvenir est que l'ordre des boucles for à l'intérieur de la compréhension de la liste est basé sur l'ordre dans lequel elles apparaissent dans l'approche de boucle traditionnelle. La boucle la plus externe vient en premier, puis les boucles internes par la suite.
Ainsi, la compréhension de liste équivalente serait:
En général, l'
if-else
instruction vient avant la première boucle for, et si vous n'avez qu'uneif
instruction, elle viendra à la fin. Par exemple, si vous souhaitez ajouter une liste vide, si elletag
n'est pas dans l'entrée, vous le feriez comme ceci:la source
Le LC approprié serait
L'ordre des boucles dans le LC est similaire à ceux des boucles imbriquées, les instructions if vont à la fin et les expressions conditionnelles vont au début, quelque chose comme
Voir la démo -
MODIFIER - Puisque vous avez besoin que le résultat soit aplati, vous pouvez utiliser une compréhension de liste similaire, puis aplatir les résultats.
En ajoutant cela ensemble, vous pouvez simplement faire
Vous utilisez ici une expression de générateur au lieu d'une compréhension de liste. (Correspond parfaitement à la limite de 79 caractères aussi (sans l'
list
appel))la source
Production:
la source
En compréhension, l'itération des listes imbriquées doit suivre le même ordre que l'équivalent imbriqué pour les boucles.
Pour comprendre, nous prendrons un exemple simple de la PNL. Vous souhaitez créer une liste de tous les mots à partir d'une liste de phrases où chaque phrase est une liste de mots.
Pour supprimer les mots répétés, vous pouvez utiliser un ensemble {} au lieu d'une liste []
ou postuler
list(set(all_words))
la source
la source