通过将正则表达式与元素匹配来拆分列表

2024-05-19 00:02:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表,里面有一些特定的元素。我想根据这些元素将该列表拆分为“子列表”或不同的列表。例如:

test_list = ['a and b, 123','1','2','x','y','Foo and Bar, gibberish','123','321','June','July','August','Bonnie and Clyde, foobar','today','tomorrow','yesterday']

如果元素与“something and something”匹配,我想拆分为子列表:

^{pr2}$

到目前为止,如果在特定元素之后有固定数量的项目,我可以完成这项工作。例如:

import re
element_regex = re.compile(r'[A-Z a-z]+ and [A-Z a-z]+')
new_list = [test_list[i:(i+4)] for i, x in enumerate(test_list) if element_regex.match(x)]

这几乎就在那里,但是在特定的兴趣元素后面并不总是有三个元素。有没有比在每一个项目上循环更好的方法?在


Tags: and项目testre元素列表foobar
2条回答

如果你想要一条线

new_list = reduce(lambda a, b: a[:-1] + [ a[-1] + [ b ] ] if not element_regex.match(b) or not a[0] else a + [ [ b ] ], test_list, [ [] ])

会的。然而,python way将使用更详细的变体。在

我在2.1GHz的4核i7上做了一些速度测量。timeit模块运行这个代码1.000.000次,需要11.38秒。使用itertools模块中的groupby(另一个答案是karas variant)需要9.92秒。最快的变体是我建议的冗长版本,只需要5.66秒:

^{pr2}$

您不需要regex,只需使用^{}

>>> from itertools import groupby
>>> from operator import add
>>> g_list=[list(g) for k,g in groupby(test_list , lambda i : 'and' in i)]
>>> [add(*g_list[i:i+2]) for i in range(0,len(g_list),2)]
[['a and b, 123', '1', '2', 'x', 'y'], ['Foo and Bar, gibberish', '123', '321', 'June', 'July', 'August'], ['Bonnie and Clyde, foobar', 'today', 'tomorrow', 'yesterday']]

首先,我们用这个lambda函数lambda i : 'and' in i对列表进行分组,该函数查找其中包含"and"的元素!然后我们有了这个:

^{pr2}$

因此,我们必须连接这里的2对列表,我们使用add运算符和一个列表理解!在

相关问题 更多 >

    热门问题