2013-08-31 13 views
44

mam dwie listy poniżejJak wrobić dwie pętle w listowych pytona

tags = [u'man', u'you', u'are', u'awesome'] 
entries = [[u'man', u'thats'],[ u'right',u'awesome']] 

chcę wyodrębnić wpisy z entries gdy są w tags:

result = [] 

for tag in tags: 
    for entry in entries: 
     if tag in entry: 
      result.extend(entry) 

Jak mogę napisać dwie pętle jako ze zrozumieniem dla pojedynczej linii?

+2

użyć 'itertools.chain' Jeśli chcesz spłaszczoną listę:' List (łańcuch .from_iterable (wpis dla tagu w tagach do wprowadzania w pozycjach, jeśli tag w wpisie)) ' –

Odpowiedz

57

ten powinien zrobić:

[entry for tag in tags for entry in entries if tag in entry] 
3

Odpowiedni LC byłoby

[entry for tag in tags for entry in entries if tag in entry] 

Kolejność pętli w LC jest podobna do tych w zagnieżdżonych pętli if oświadczenia przejść do końca i wyrażenia warunkowe przejść na początku, coś jak

[a if a else b for a in sequence] 

Zobacz 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 - Ponieważ wynik jest spłaszczony, można użyć podobnego spisu, a następnie spłaszczyć wyniki.

>>> 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'] 

Dodawanie tym razem, może po prostu zrobić

>>> 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'] 

użyć wyrażenia generatora tutaj zamiast listy zrozumieniem. (Idealnie pasuje limit 79 znaków zbyt (bez wezwania list))

76

Najlepszym sposobem, aby pamiętać, jest to, że kolejność pętli wewnątrz listowego bazuje w kolejności, w jakiej pojawiają się w tradycyjnym podejściu pętli. Najbardziej zewnętrzna pętla jest pierwsza, a następnie wewnętrzne pętle.

więc odpowiednikiem lista rozumienie byłoby:

[entry for tag in tags for entry in entries if tag in entry] 

Ogólnie if-else oświadczenie przychodzi przed pierwszym pętli, a jeśli masz tylko oświadczenie if, to przyjdzie na końcu. Np, jeśli chcesz dodać pustą listę, jeśli tag nie jest w pozycji, by to zrobić tak:

[entry if tag in entry else [] for tag in tags for entry in entries]