繁体   English   中英

如何对列表中的类似项目进行分组?

[英]How to group similar items in a list?

我希望根据字符串中的前三个字符对列表中的类似项进行分组。 例如:

test = ['abc_1_2', 'abc_2_2', 'hij_1_1', 'xyz_1_2', 'xyz_2_2']

如何根据第一组字母(例如'abc' )将上述列表项分组? 以下是预期输出:

output = {1: ('abc_1_2', 'abc_2_2'), 2: ('hij_1_1',), 3: ('xyz_1_2', 'xyz_2_2')}

要么

output = [['abc_1_2', 'abc_2_2'], ['hij_1_1'], ['xyz_1_2', 'xyz_2_2']]

我尝试使用itertools.groupby来完成此操作但没有成功:

>>> import os, itertools
>>> test = ['abc_1_2', 'abc_2_2', 'hij_1_1', 'xyz_1_2', 'xyz_2_2']
>>> [list(g) for k.split("_")[0], g in itertools.groupby(test)]
[['abc_1_2'], ['abc_2_2'], ['hij_1_1'], ['xyz_1_2'], ['xyz_2_2']]

我查看了以下帖子但没有成功:

如何合并列表中的类似项目 该示例使用对我的示例过于复杂的方法对类似项目(例如'house''Hose' )进行分组。

如何在Python列表中将等效项组合在一起? 这是我找到列表理解的想法。

.split("_")[0]部分应该在单个参数函数中,作为第二个参数传递给itertools.groupby

>>> import os, itertools
>>> test = ['abc_1_2', 'abc_2_2', 'hij_1_1', 'xyz_1_2', 'xyz_2_2']
>>> [list(g) for _, g in itertools.groupby(test, lambda x: x.split('_')[0])]
[['abc_1_2', 'abc_2_2'], ['hij_1_1'], ['xyz_1_2', 'xyz_2_2']]
>>>

将它放在for ...部分中什么都不做,因为结果立即被丢弃。


此外,当您只需要一次拆分时,使用str.partition会稍微有点效率:

[list(g) for _, g in itertools.groupby(test, lambda x: x.partition('_')[0])]

演示:

>>> from timeit import timeit
>>> timeit("'hij_1_1'.split('_')")
1.3149855638076913
>>> timeit("'hij_1_1'.partition('_')")
0.7576401470019234
>>>

这不是一个主要问题,因为这两种方法在小字符串上都非常快,但我想我会提到它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM