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