繁体   English   中英

如何深入搜索Python列表?

[英]How can I deep search a Python list?

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

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

我怎样才能做到这一点?

不确定快速的方法来实现多层嵌套,但像这样的递归算法可以解决这个问题:

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

您也可以查看这个以展平多嵌套列表:

用于展平嵌套列表的递归生成器

你可以结合flatten功能 (认为它是一个递归版本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的堆栈限制。

如果您有列表列表,则可以使用此方法

>>> 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循环...

一种方法:

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

不漂亮但工作。

我最近需要这样做,需要一个简单的解决方案。 所以我将它添加为一种快速而肮脏的方式来压缩/搜索列表(可能不是一个完美的解决方案,但它对我有用)。

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

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

如果你只有一个带有整数或字符的嵌套列表,解决这个问题的一种方法是创建一个没有所有不需要的元素的列表(没有'[',']'...):

假设我们有一个带字符的嵌套列表:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM