2016-02-14 14 views
13

Doskonale zdaję sobie sprawę z tego ..Jak przeszukiwać listę znajdującą się w zagnieżdżonej liście (liście) bez pętli w Pythonie?

sample=[[1,[1,0]],[1,1]] 
[1,[1,0]] in sample 

ten powróci True.

Ale to, co chcę tutaj zrobić, to jest to.

sample=[[1,[1,0]],[1,1]] 
[1,0] in sample 

Chcę, aby powrót był Prawdziwy, ale to zwraca Fałsz. mogę to zrobić:

sample=[[1,[1,0]],[1,1]] 
for i in range(len(sample)): 
    [1,0] in sample[i] 

Ale zastanawiam się, czy istnieje lepiej lub skuteczny sposób to zrobić.

+0

Można użyć 'dla indeksu ELEM w enumerate (próbka): [1, 0] w elem' nad' range (len()) '--unrelated, po prostu czystsze – cat

Odpowiedz

6

można użyć łańcucha z itertools scalić list, a następnie wyszukać w zwracanej listy.

>>> sample=[[1,[1,0]],[1,1]] 
>>> from itertools import chain 
>>> print [1,0] in chain(*sample) 
True 
+0

Nie powiedzie się, jeśli którykolwiek element listy początkowej nie jest możliwy do sprawdzenia. – schwobaseggl

+2

pytanie zawiera listę list. jeśli chcesz znaleźć listy w dowolnej strukturze, to wchodziłoby w obszar analizowania. w którym może być zastosowany wzór dopasowania lub goście. (zauważ, że oba wymagają przejścia przez zestaw znanych struktur). – Alex

1

Nie wiem, jak rozwiązać to całkowicie bez pętli. Ale w Pythonie nie powinieneś nigdy pisać for i in range(len(sample)).

Tak więc odpowiedź na Twoje pytanie: Tak, istnieje lepszy i szybszy sposób mógłbyś pętla lista for i in sample

Sposób Python obsługuje pętle jest bardzo szybki i działa bardzo dobrze z wieloma entriey (więcej niż 50 000).

1

Można flatten listę sample a następnie wyszukać w tym wykazie spłaszczona:

> sample = [[1, [1, 0]], [1, 1]] 
> [1, 0] in [item for sublist in sample for item in sublist] 
> True 
+0

Ale wtedy' [1, 1] 'zawiedzie, ponieważ zostanie spłaszczone do' 1,1'. – Maroun

+0

@MarounMaroun tak, nie znajdzie to '1,1' ale" praca "dla pętli podanej w pytaniu też tego nie znajdzie, więc pomyślałem, że tak powinno być. – bastelflp

+0

Spłaszczanie listy może nie być w stanie obsłużyć wszystkich problemów. – Eric

4

Rekurencyjne rozwiązanie, które zadziałałoby na dowolne (głębokie zagłębienie rekursji) głębokie zagnieżdżanie. Działa również, jeśli dowolne elementy z najbardziej zewnętrznej listy nie są same w sobie.

from functools import partial 

def contains_nested(some_iterable, elmnt): 
    try: 
     if elmnt in some_iterable: 
      return True 
    except TypeError: # some_iterable is not iterable 
     return False 
    else: 
     return any(map(partial(contains_nested, elmnt=elmnt), some_iterable)) 
Powiązane problemy