2016-02-14 114 views
13

我完全意識到這一點..如何搜索Python中沒有循環的嵌套列表(列表列表)中的列表?

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

這將返回True。

但我想在這裏做的是這個。

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

我希望返回值爲True,但是這會返回False。 我可以這樣做:

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

但我想知道是否有這樣做的任何更好高效方式。

+0

可以(樣品)使用'爲索引,在ELEM枚舉:[1,0]在elem'超過'範圍(LEN())'--unrelated,只是清潔器 – cat

回答

6

可以使用從itertools鏈合併列表,然後在返回的列表中進行搜索。

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

但是,如果初始列表中的任何元素都不可迭代,則這會失敗。 – schwobaseggl

+2

這個問題說清單的列表。如果你想在任意結構中找到列表,這將進入解析領域。模式匹配或訪問者可能會應用。 (注意兩者都需要遍歷一組已知結構)。 – Alex

1

我不知道如何解決這個問題,沒有一個循環。但在Python中,你絕對不應該寫for i in range(len(sample))

所以回答你的問題:是的,有一個更好,更快的方法你可以循環列表for i in sample

Python的處理循環的方式實在是快,工作也非常好,很多entriey(更比50.000)。

1

您可以flattensample列表,然後搜索在扁平列表:

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

但隨後'[1, 1]'會失敗,因爲它會變平到'1,1'。 – Maroun

+0

@MarounMaroun是的,它不會找到'1,1',但問題中給出的'working'for循環也不會找到它,所以我認爲它應該是這樣的。 – bastelflp

+0

拼合列表可能無法處理所有問題 – Eric

4

一個遞歸解決方案,適用於任意深度嵌套(最大遞歸深度)。如果最外層列表中的任何元素本身都不是可迭代對象,也適用。

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))