2013-03-08 53 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