gpt4 book ai didi

Python2.7 : Extract slice from a list based on a pattern in a Pythonic way

转载 作者:行者123 更新时间:2023-11-28 22:32:25 26 4
gpt4 key购买 nike

我在列表中有大量数据。该列表由短字符串组成。列表内部是长度为 5 的隐藏切片,它们匹配特定模式:

[<date>, <date>, <4 digit integer>, <string>, <$ amount>]

如何从我的数据集中提取这些切片?它们可以出现在任何位置(因此它们的索引不能保证是 5 的倍数)并且散布在可以匹配部分模式的其他数据(也包括字符串)中。

我从类似于以下内容开始:

for item in data:
if re.search(<date pattern>, item):
if not date1:
date1 = item
else:
date2 = item
if re.search(<4 digit integer pattern>, item):
if date1 and date2 and not fourdigit:
fourdigit = item
else:
date1 = None
date2 = None
....

但这非常复杂,容易出错,而且根本不是 pythonic。

下一个方法是从数据列表中提取 5 个项目的滑动窗口,并检查所有项目是否匹配它们的模式。如果不是,则将索引递增 1(即,将窗口滑动 1)并检查下一个切片。如果模式匹配,保存切片,并将索引递增 5。类似于:

index = 0
while index < (len(data)-5):
sliceof5 = data[index:index+5]
if slice_matches_pattern(sliceof5):
matching_items.append(sliceof5)
index += 5
else:
index += 1

这行得通并且更容易实现并且以前的解决方案更不容易出错,但看起来也不是很 pythonic。

是否可以使用列表理解来做到这一点?像这样的东西:

matching_items = [ sliceof5 if slice_matches_pattern(sliceof5) for sliceof5 in data ]

但是,我如何使列表推导中的 for 有时向前跳 1,有时向前跳 5。

是否有其他 pythonic 方法可以实现这一点?

最佳答案

您的第二个解决方案似乎不错。我会将其更改为生成器(yield 您找到的切片),但不会更多。

不过,您可以通过在切片的第 2 项中查找日期来使其运行得更快。如果不是日期,则可以在索引中添加两个。

当然,如果你能把所有东西都变成一个大的正则表达式来匹配你的整个模式,你会做得更好。

关于Python2.7 : Extract slice from a list based on a pattern in a Pythonic way,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40942489/

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