我希望根据字符串中的前三个字符对列表中的类似项进行分组。例如:
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']]
我查看了以下帖子但没有成功:
How to merge similar items in a list。该示例使用一种过于复杂的方法对类似的项目(例如'house'
和'Hose'
)进行分组。
How can I group equivalent items together in a Python list?。这就是我找到列表理解的想法。
答案 0 :(得分:9)
.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
>>>
这不是一个主要问题,因为这两种方法在小字符串上都相当快,但我想我会提到它。