gpt4 book ai didi

python - 优雅地在列表中查找子列表

转载 作者:IT老高 更新时间:2023-10-28 22:25:31 26 4
gpt4 key购买 nike

给定一个列表,其中包含一个被噪声包围的已知模式,是否有一种优雅的方法来获取与该模式相同的所有项目。下面是我的粗略代码。

list_with_noise = [7,2,1,2,3,4,2,1,2,3,4,9,9,1,2,3,4,7,4,3,1,2,3,5]
known_pattern = [1,2,3,4]
res = []


for i in list_with_noise:
for j in known_pattern:
if i == j:
res.append(i)
continue

print res

我们会得到 2, 1, 2, 3, 4, 2, 1, 2, 3, 4, 1, 2, 3, 4, 4, 3

奖励:如果不存在完整模式,请避免附加 i(即,允许 1,2,3,4 但不允许 1,2,3)

例子:

find_sublists_in_list([7,2,1,2,3,4,2,1,2,3,4,9,9,1,2,3,4,7,4,3,1,2,3,5],[1,2,3,4])

[1,2,3,4],[1,2,3,4],[1,2,3,4]


find_sublists_in_list([7,2,1,2,3,2,1,2,3,6,9,9,1,2,3,4,7,4,3,1,2,6],[1,2,3,4])

[1,2,3],[1,2,3],[1,2,3]

列表包含命名元组。

最佳答案

我知道这个问题已经 5 个月大并且已经“接受”了,但是在谷歌上搜索一个非常相似的问题让我想到了这个问题,所有的答案似乎都有几个相当重要的问题,而且我很无聊,想试着给出一个 SO 答案,所以我只是要喋喋不休地说出我发现的东西。

据我了解,问题的第一部分非常简单:只需返回原始列表,过滤掉所有不在“模式”中的元素。按照这样的想法,我想到的第一个代码使用了 filter() 函数:

def subfinder(mylist, pattern):
return list(filter(lambda x: x in pattern, mylist))

我会说这个解决方案肯定比原来的解决方案更简洁,但它并没有更快,或者至少没有明显的感觉,如果没有很好的理由使用 lambda 表达式,我会尽量避免使用它们。事实上,我能想出的最佳解决方案涉及一个简单的列表理解:

def subfinder(mylist, pattern):
pattern = set(pattern)
return [x for x in mylist if x in pattern]

这个解决方案比原来的解决方案更优雅,速度也明显更快:理解比原来的速度快 120%,而在我的测试中,将模式转换为一组第一个凹凸的速度高达惊人的 320%。

p>

现在是奖金:我会直接进入它,我的解决方案如下:

def subfinder(mylist, pattern):
matches = []
for i in range(len(mylist)):
if mylist[i] == pattern[0] and mylist[i:i+len(pattern)] == pattern:
matches.append(pattern)
return matches

这是 Steven Rumbalski 的“inefficient one liner”的变体,添加了“mylist[i] == pattern[0]”检查,并且由于 python 的短路评估,它比两者都快得多原始声明和 itertools 版本(以及据我所知的所有其他提供的解决方案)并且它甚至支持重叠模式。就这样吧。

关于python - 优雅地在列表中查找子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10106901/

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