首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对Python列表进行深度搜索?

如何对Python列表进行深度搜索?
EN

Stack Overflow用户
提问于 2013-03-08 19:25:51
回答 6查看 3.2K关注 0票数 4

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

代码语言:javascript
复制
my_list = [2, [3, 4, [2, 3]], 1, [4, [5]]]

我该怎么做呢?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-03-08 20:05:48

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

代码语言:javascript
复制
>>> 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更好的方法了……

票数 1
EN

Stack Overflow用户

发布于 2013-03-08 19:55:04

对于多级嵌套,不确定有没有快速的方法,但像这样的递归算法可以做到这一点:

代码语言:javascript
复制
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

票数 3
EN

Stack Overflow用户

发布于 2013-03-08 20:37:19

您可以将flatten function (将其视为itertools.chain的递归版本)与Python的标准in运算符(在生成器上执行线性搜索)相结合,以获得以下结果:

代码语言:javascript
复制
>>> 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15292893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档