Mam dwie listy, jak poniżej
tags = [u'man', u'you', u'are', u'awesome']
entries = [[u'man', u'thats'],[ u'right',u'awesome']]
Chcę wpisów wyciąg z entries
kiedy są w tags
:
result = []
for tag in tags:
for entry in entries:
if tag in entry:
result.extend(entry)
Jak mogę zapisać te dwie pętle jako jedno wierszowe rozumienie listy?
python
list
for-loop
list-comprehension
Shiva Krishna Bavandla
źródło
źródło
itertools.chain
jeśli chcesz spłaszczoną listę:list(chain.from_iterable(entry for tag in tags for entry in entries if tag in entry))
Odpowiedzi:
To powinno wystarczyć:
źródło
Najlepszym sposobem na zapamiętanie tego jest to, że kolejność pętli for wewnątrz rozumienia list jest oparta na kolejności, w jakiej pojawiają się w tradycyjnym podejściu pętlowym. Najpierw pętla zewnętrzna, a następnie pętle wewnętrzne.
Zatem równoważne rozumienie listy wyglądałoby tak:
Ogólnie rzecz biorąc,
if-else
instrukcja występuje przed pierwszą pętlą for, a jeśli masz tylkoif
instrukcję, pojawi się na końcu. Na przykład, jeśli chcesz dodać pustą listę, jeślitag
nie ma jej we wpisie, możesz to zrobić w ten sposób:źródło
Odpowiednie LC byłoby
Kolejność pętli w LC jest podobna do tych w zagnieżdżonych pętlach, instrukcje if idą na koniec, a wyrażenia warunkowe na początku, coś w rodzaju
Zobacz demo -
EDYTUJ - ponieważ potrzebujesz spłaszczenia wyniku, możesz użyć podobnego rozumienia listy, a następnie spłaszczyć wyniki.
Dodając to razem, możesz po prostu zrobić
Używasz tutaj wyrażenia generatora zamiast rozumienia listy. (Idealnie pasuje również do limitu 79 znaków (bez
list
wywołania))źródło
Wynik:
źródło
źródło
Zrozumienie, iteracja zagnieżdżonych list powinna mieć tę samą kolejność, co odpowiednik imbricowany dla pętli.
Aby to zrozumieć, weźmiemy prosty przykład z NLP. Chcesz utworzyć listę wszystkich słów z listy zdań, gdzie każde zdanie jest listą słów.
Aby usunąć powtarzające się słowa, możesz użyć zestawu {} zamiast listy []
lub aplikuj
list(set(all_words))
źródło