Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对列表的字符串进行聚类并返回列表列表_Python_String_List - Fatal编程技术网

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
函数一无所知。我真的非常感谢你,我要自杀了。。。