Python 如何在列表中对相似项进行分组?

Python 如何在列表中对相似项进行分组?,python,list,itertools,Python,List,Itertools,我希望根据字符串中的前三个字符在列表中对类似的项目进行分组。例如: 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')} 或 我曾尝试使用itertools.groupby来完成此任务,

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

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')}


我曾尝试使用
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']]

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

>>> 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'

。这就是我找到列表理解的想法的地方。

部分
.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']]
>>>
将其放在…部分中不会有任何作用,因为结果会立即被丢弃


此外,当您只需要一次拆分时,使用它会稍微更有效:

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


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

谢谢,这非常有效。我最近发现,确保输入列表已排序是一种很好的做法,例如
test=sorted(['abc_1_2','abc_2_2','hij_1_1','xyz_1_2','xyz_2_2'])
。否则,如果未对输入列表进行排序,
itertools.groupby
将无法按预期工作。是的,在使用
itertools.groupby
时,首先对列表进行排序是一种很好的做法。这是因为
groupby
只捕获类似值的运行。也就是说,如果列表没有排序,它可能会遗漏一些内容。不过我没有在我的帖子中提到这一点,因为主要关注的是如何使用
groupby
,而且你的列表已经排序好了。
>>> from timeit import timeit
>>> timeit("'hij_1_1'.split('_')")
1.3149855638076913
>>> timeit("'hij_1_1'.partition('_')")
0.7576401470019234
>>>