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

mua*_*mar 2 python string list

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

a = ['aaa-t1', 'aaa-t2', 'aab-t1', 'aab-t2', 'aab-t3', 'abc-t2']
Run Code Online (Sandbox Code Playgroud)

我想通过相似性来聚类这些字符串.您可能会注意到,a[0]a[1]共享相同的根:aaa.我想生成一个新的列表列表,如下所示:

b = [['aaa-t1', 'aaa-t2'], ['aab-t1', 'aab-t2', 'aab-t3'], ['abc-t2']]
Run Code Online (Sandbox Code Playgroud)

怎么办呢?到目前为止,我没有成功,我没有任何体面的代码可以显示.我正在尝试比较字符串,fuzzywuzzy但这样做需要创建可能的字符串组合,并且与列表的长度严重缩放.

nie*_*mmi 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']]
Run Code Online (Sandbox Code Playgroud)

groupby返回一个可迭代的元组(key, group),其中key是用于分组的键,并且group可以迭代组中的项.给出的第一个参数groupby是可生成组的迭代,可选的第二个参数是一个被调用以生成密钥的关键函数.由于groupby只有组,因此a需要首先对连续元素进行排序.

  • 请注意,要使`groupby`正常工作,您需要使用您要分组的相同键_sort_输入.在这种情况下,按字典顺序排序是足够好的(因为键只是查看前几个字符),但在许多情况下它不是. (2认同)
  • @mgilson是的,这就是调用`sorted`的原因.因为在这种情况下,没有必要为排序指定密钥我用最短和最简单的答案. (2认同)