如何深入搜索Python列表?

时间:2013-03-08 11:25:51

标签: python search arraylist

我想深入搜索Python中的列表。例如,我想知道5是否在my_list中。

my_list = [2, [3, 4, [2, 3]], 1, [4, [5]]]

我该怎么做?

6 个答案:

答案 0 :(得分: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

答案 1 :(得分: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代码 - 例如,元组将像列表一样扁平化为搜索,并搜索字符串递归,直到它达到Python的堆栈限制。

答案 2 :(得分: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-loops ...

答案 3 :(得分: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

不漂亮但工作正常。

答案 4 :(得分: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))

正则表达式基本上会使列表变平,但不会对列表项中的特殊字符起作用。

答案 5 :(得分:-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