我有一个字符串列表如下:
a = ['aaa-t1', 'aaa-t2', 'aab-t1', 'aab-t2', 'aab-t3', 'abc-t2']
我想按相似性对这些字符串进行聚类。您可能会注意到,a[0]
和a[1]
共享同一个根:aaa
。我想生成一个新的列表列表,如下所示:
b = [['aaa-t1', 'aaa-t2'], ['aab-t1', 'aab-t2', 'aab-t3'], ['abc-t2']]
这样做的方法是什么?到目前为止,我没有成功,我没有任何体面的代码可以显示。我正在尝试将字符串与fuzzywuzzy
进行比较,但这样做需要创建字符串的可能组合,并且与列表的长度严重缩放。
答案 0 :(得分:6)
您可以使用groupby
按照str.split
生成的密钥对字符串进行分组:
>>> from itertools import groupby
>>> a = ['aaa-t1', 'aaa-t2', 'aab-t1', 'aab-t2', 'aab-t3', 'abc-t2']
>>> [list(g) for k, g in groupby(sorted(a), lambda x: x.split('-', 1)[0])]
[['aaa-t1', 'aaa-t2'], ['aab-t1', 'aab-t2', 'aab-t3'], ['abc-t2']]
groupby
返回一个可迭代的元组(key, group)
,其中key
是用于分组的密钥,group
是组中可迭代的项目。给groupby
的第一个参数是可生成组的迭代,可选的第二个参数是一个被调用以生成密钥的关键函数。由于groupby
仅对连续元素a
进行分组,因此需要先对其进行排序。