聚类列表的字符串并返回列表列表

时间:2017-02-12 04:28:22

标签: python string list

我有一个字符串列表如下:

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进行比较,但这样做需要创建字符串的可能组合,并且与列表的长度严重缩放。

1 个答案:

答案 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进行分组,因此需要先对其进行排序。