Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检查值是否在嵌套列表中_Python_List_Python 3.x_Search_Nested - Fatal编程技术网

Python 如何检查值是否在嵌套列表中

Python 如何检查值是否在嵌套列表中,python,list,python-3.x,search,nested,Python,List,Python 3.x,Search,Nested,我想检查某个值是否在嵌套列表中。我有一个包含更多列表的主列表,它可以包含更多列表,以此类推。。就这样, [['Hey', 1], 0, 0, 0, ['Heyyy', 1], [[['Hi', 1], ['Hiii', 1]], ['Hola', 1]], ['Hollaa', 2], ['Hallo', 1], 0, ['Hallooo', 1]] 现在我想检查一下,例如,其中一个列表中是否有'Hiii',如果这是真的,我想更改列表的第二个值 到目前为止,我用递归和生成器进行了尝试,

我想检查某个值是否在嵌套列表中。我有一个包含更多列表的主列表,它可以包含更多列表,以此类推。。就这样,

[['Hey', 1], 0, 0, 0, ['Heyyy', 1], [[['Hi', 1], ['Hiii', 1]], 
['Hola',    1]], ['Hollaa', 2], ['Hallo', 1], 0, ['Hallooo', 1]]
现在我想检查一下,例如,其中一个列表中是否有'Hiii',如果这是真的,我想更改列表的第二个值

到目前为止,我用递归和生成器进行了尝试,但我确实不知道这是如何工作的。。我不知道如何更改列表的第二个值

def search(nested_list):
    for value in nested_list:
        for subvalue in search(value):
            yield subvalue
提前感谢您的帮助

给定:

LoL=[['Hey', 1], 0, 0, 0, ['Heyyy', 1], [[['Hi', 1], ['Hiii', 1]], 
['Hola',    1]], ['Hollaa', 2], ['Hallo', 1], 0, ['Hallooo', 1]]
要检查值是否在列表列表中,请首先使用生成器展平任意列表:

def flatten(it):
    for x in it:
        if (isinstance(x, collections.Iterable) and
            not isinstance(x, str)):
            yield from flatten(x)
        else:
            yield x 
然后使用
any

>>> any(x=="Hiii" for x in flatten(LoL))
True
>>> any(x=="BooHoo" for x in flatten(LoL))
False

要更改现有列表的列表,请执行以下操作:

def LoLedit(li, tgt, nv):
    if isinstance(li, list):
        if li[0]==tgt: 
            li[1]=nv
        else:
            for next_item in li:
                LoLedit(next_item, tgt, nv)
    return li   

>>> LoLedit(LoL,"Hiii", "Changed")
[['Hey', 1], 0, 0, 0, ['Heyyy', 1], [[['Hi', 1], ['Hiii', 'Changed']], ['Hola', 1]], ['Hollaa', 2], ['Hallo', 1], 0, ['Hallooo', 1]]

一个非常基本的递归函数,用于查找和更新值

def search(n_list):
     for i in n_list:
         if isinstance(i, list):
             search(i)
         elif i == 'Hiii':
             try:
                 n_list[1] = # your value here
             except:
                 pass

您的思路是正确的,但这里不需要生成器函数-简单的递归w/find&change就足够了:

def search(source, find, new_value):
    if isinstance(source, list):  # no point searching in non-lists
        if find in source:
            source[1] = new_value
        else:
            for item in source:
                search(item, find, new_value)


data = [['Hey', 1], 0, 0, 0, ['Heyyy', 1], [[['Hi', 1], ['Hiii', 1]], ['Hola', 1]],
        ['Hollaa', 2], ['Hallo', 1], 0, ['Hallooo', 1]]

search(data, "Hiii", 5)

print(data)
# prints:
# [['Hey', 1], 0, 0, 0, ['Heyyy', 1], [[['Hi', 1], ['Hiii', 5]], ['Hola', 1]],
# ['Hollaa', 2], ['Hallo', 1], 0, ['Hallooo', 1]]

这是假设您不想在找到项目后进行更深入的搜索。

另一种检查某个值是否在嵌套列表(列表列表)中的方法可以使用递归来完成:

# Flatten the list of lists into a simple list
def flatten_list(my_list, final=None):                                       
    if final is None:                                               
        final = []

    for i in my_list:
        if isinstance(i, list):
            flatten_list(i, my_list)
        else:
            final.append(i)

    return final

a = [['Hey', 1], 0, 0, 0, ['Heyyy', 1], [[['Hi', 1], ['Hiii', 1]], 
['Hola',    1]], ['Hollaa', 2], ['Hallo', 1], 0, ['Hallooo', 1]]

check_element = lambda x, y: x in flatten_list(y)

# Some tests:
print(check_element('hey', a))
print(check_element('Hey', a))
print(check_element('Heyyy', a))
print(check_element('Hiii', a))
print(check_element(1, a))
print(check_element('foo', a))
输出:

False
True
True
True
True
False

仔细阅读问题:这如何允许用户更改列表中找到目标的第二个元素?但不确定这是否回答了如何更新列表中的第二个项目