Python 对列表的字符串进行聚类并返回列表列表
我有一个字符串列表,如下所示:Python 对列表的字符串进行聚类并返回列表列表,python,string,list,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']] 这样做的方法是什么?。到目前为止,我还没有成功,也没有任何像样的代
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']]
这样做的方法是什么?。到目前为止,我还没有成功,也没有任何像样的代码可以显示。我试着将字符串与fuzzyfuzzy
进行比较,但这样做需要创建可能的字符串组合,并且这种组合会随着列表的长度而严重扩展 您可以使用按使用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
返回元组的iterable(键,组)
其中key
是用于分组的键,group
是组中项目的iterable。给groupby
的第一个参数是用来生成组的iterable,可选的第二个参数是用来生成键的键函数。由于groupby
仅对连续元素进行分组,因此需要首先对a
进行排序。什么是“相似性”规则?这是像“在第一个-
之前把所有的东西都拿出来,然后用它来装箱”这样简单的事情吗?还是你需要做更复杂的相似性(一种类似的东西?@mgilson我认为“在第一个-
之前把所有的东西都拿出来”就行了。我不知道word2vec,但看到它也会很惊奇!。请注意,要使groupby
起作用,需要按分组依据的键对输入进行排序。在本例中,按字典顺序排序已经足够好了(因为键只是查看前两个字符),但在许多情况下并非如此。@mgilson True,这就是调用sorted
的原因。因为在这种情况下,不需要指定排序的键,所以我选择了最短最简单的答案。@niemmi Holy s!!!!它起作用了!。我对groupby
函数一无所知。我真的非常感谢你,我要自杀了。。。