gpt4 book ai didi

python - 使用 Python 在另一个列表中搜索列表的值

转载 作者:太空宇宙 更新时间:2023-11-03 12:29:47 24 4
gpt4 key购买 nike

我正在尝试查找列表的子列表。意思是如果 list1 say [1,5] 在 list2 say [1,4,3,5,6] 中,它应该返回 True。我到目前为止是这样的:

for nums in l1:
if nums in l2:
return True
else:
return False

这是正确的,但我试图仅当 list1 按相应顺序位于 list2 中时才返回 True。所以如果 list2 是 [5,2,3,4,1],它应该返回 False。我在考虑使用 < 比较 list1 的索引值,但我不确定。

最佳答案

try:
last_found = -1
for num in L1:
last_found = L2.index(num, last_found + 1)
return True
except ValueError:
return False

列表L2的index方法返回第一个参数(num)在列表中的位置;像这里一样调用第二个 arg,它开始在该位置的列表中查找。如果 index 没有找到它要查找的内容,它会引发一个 ValueError 异常。

因此,此代码使用此方法在 L2 中按顺序查找 L1 的每个项目 num。第一次需要从0位置开始找;接下来的每一次,它都需要从找到前一项的最后一个之后的位置开始查找,即 last_found + 1(因此在开始时我们必须设置 last_found = -1 第一次从位置 0 开始查找)。

如果以这种方式找到了 L1 中的每个项目(即在找到前一个项目的位置之后在 L2 中找到了它),则这两个列表满足给定条件并且代码返回 True。如果未找到 L1 的任何项目,代码将捕获生成的 ValueError 异常并仅返回 False

一种不同的方法是在两个列表上使用迭代器,这可以通过iter 内置函数形成。您可以通过调用内置的 next 来“推进”迭代器;如果没有“下一项”,即迭代器耗尽,这将引发 StopIteration。如果适用,您还可以在迭代器上使用 for 以获得更流畅的界面。使用 iter/next 想法的低级方法:

i1 = iter(L1)
i2 = iter(L2)
while True:
try:
lookfor = next(i1)
except StopIteration:
# no more items to look for == all good!
return True
while True:
try:
maybe = next(i2)
except StopIteration:
# item lookfor never matched == nope!
return False
if maybe == lookfor:
break

或者,更高级一点:

i1 = iter(L1)
i2 = iter(L2)
for lookfor in i1:
for maybe in i2:
if maybe == lookfor:
break
else:
# item lookfor never matched == nope!
return False
# no more items to look for == all good!
return True

事实上,这里 iter 的唯一关键用途是获取 i2 —— 将内循环设置为 for maybe in i2 保证内循环不会开始每次都从头开始查找,而是会继续查找上次停止的地方。外循环也可以用于 for lookfor in L1:,因为它没有“重新启动”问题。

这里的关键是循环的 else: 子句,当且仅当循环没有被 break 打断而是自然退出时才会触发。

进一步研究这个想法,我们再次想起 in 运算符,它也可以通过使用迭代器简单地从上次中断的地方继续。大简化:

i2 = iter(L2)
for lookfor in L1:
if lookfor not in i2:
return False
# no more items to look for == all good!
return True

但现在我们认识到这正是短路 anyall 内置“短路累加器”函数抽象出的模式,所以...... :

i2 = iter(L2)
return all(lookfor in i2 for lookfor in L1)

我相信这是您所能做到的最简单的事情。这里留下的唯一非基本位是:您需要明确地使用 iter(L2) 一次,以确保 in 运算符(本质上是一个内部循环)不会从头开始搜索,而是每次都从上次停止的地方继续搜索。

关于python - 使用 Python 在另一个列表中搜索列表的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1695452/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com