2013-03-08 60 views

回答

1

如果你有一個列表的列表,你可以使用這種方法

>>> l = [[1,2,3],[4,5,6], [7], [8,9]] 
>>> [item for sublist in l for item in sublist] 
[1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> 5 in [item for sublist in l for item in sublist] 
True 

它首先使用O(n)對列表進行平滑並對其進行搜索。

如果您的列表看起來像你的榜樣,我想不出其他辦法 做得比使用for循環...

+2

這隻適用於平坦的列表的一個級別,並且每個元素保證也是可迭代的,而不是可能的搜索匹配。在這種情況下,'itertools.chain.from_iterable(l)'中的5可能比列表理解更清晰一些,並且速度肯定快一些(因爲它不會構建僅用於一個單一列表的整個列表搜索)。 – lvc 2013-03-08 12:16:39

+0

這就是我所說的(或打算說:-)請參閱http://stackoverflow.com/questions/952914/making-a-flat-list-out-of-list-of-lists-in-python – 2013-03-08 12:33:20

+0

注意對這個問題的接受答案的評論聲稱'list(itertools.chain.from_iterable(l)'比列表解析更快,事實上你並不需要*列表來做搜索(' in'在任何迭代中都可以正常工作)僅有的化合物 – lvc 2013-03-08 12:48:01

0

方式一:

def deapSearch(searchElement, searchList): 
    for element in searchList: 
     if element == searchElement: 
      return True 
     elif type(element) == type(list): 
      found = deapSearch(searchElement, element) 
      if found: 
       return found 
    return False 
deapSearch(5, my_list) 
True 
deapSearch(4, my_list) 
True 

不漂亮,但工作。

2

不知道聯繫方式和巢的多層次要做到這一點,但遞歸算法這樣會做的伎倆:

def nestedSearch(nested, v): 
    for element in nested: 
     if isinstance(element, list): 
      if nestedSearch(element, v): 
       return True 
     elif element == v: 
      return True 
    return False 

您也可以看看這個壓扁多嵌套列表:

Recursive generator for flattening nested lists

2

您可以組合flatten function(認爲它作爲一個遞歸版本的itertools.chain)與Python的標準in運營商(其中,在發電機,做了線性搜索)得到這個:

>>> def flatten(nested): 
    try: 
     for sublist in nested: 
      for element in flatten(sublist): 
       yield element 
    except TypeError: 
     yield nested 


>>> my_list = [2, [3, 4, [2, 3]], 1, [4, [5]]] 
>>> 5 in flatten(my_list) 
True 

每在鏈接的問題的意見,你將要細化flatten代碼,如果你」重新搜索是可迭代的 - 例如,元組將會b e就像列表一樣展開搜索,並搜索字符串遞歸,直到達到Python的棧限制。

-1

如果你只有一個嵌套列表與整數或字符,要解決這個問題的一個方法是創建無所有不必要的元素的列表(沒有「[」,「]」 ...):

咱就說我們有一個嵌套列表與字符:

>>> nested = [[[[['F', 'B'], 'G'], ['D', 'A']], 'C'], 'E'] 
>>> string = str(nested) 
>>> string = string.replace('[','',len(string)) 
>>> string = string.replace(']','',len(string)) 
>>> string = string.replace("'","",len(string)) 
>>> string = string.replace(" ","",len(string)) 
>>> string = string.split(',') 

它給:

>>> print (string) 
['F', 'B', 'G', 'D', 'A', 'C', 'E'] 

現在,您可以輕鬆地搜索沒有任何循環:

>>> 'F' in string 
True 
+0

必須考慮的一件事情是,整數嵌套列表在內存中比單純的字符串更昂貴,而遞歸函數並不是處理這種由於迭代深度的限制,使用Python的一個很大的優勢就是你可以在字符串中搜索,就像你在str([1,[2,15]])中搜索列表 – 2014-11-19 13:21:53

0

我最近需要做到這一點,需要一個簡單的解決方案。所以我把它作爲一個快速和骯髒的方式來加入/搜索一個列表(可能不是一個完美的解決方案,但它爲我工作)。

>>> my_list = [2, [3, 4, [2, 3]], 1, [4, [5]]] 
>>> str(5) in str(my_list) # returns True 
>>> str(my_list).find(str(5)) # returns the index 

編輯:也添加一個正則表達式的解決方案。但是如果你有更復雜的情況,那麼你可能會遍歷列表。

>>> import re 
>>> str(5) in re.findall('(?<=[,\[])([ a-zA-Z0-9 ]+)(?=[,\]])', str(my_list)) 

正則表達式基本上使列表平整,但不適用於列表項中的特殊字符。

+0

'str(5) => True'你的方法是錯誤的,你至少需要一個正則表達式。 – 2017-04-06 20:12:30