2017-02-12 40 views
2

我必須爲以下一個字符串列表:聚類串並返回一個列表的列表

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

「相似性」的規則是什麼?這是否就像「在第一個'-'前使用所有內容並將其用於分箱」一樣簡單,或者您需要做更復雜的相似處理(la'word2vec'類的東西?) – mgilson

+0

@mgilson我認爲「在第一個'-'之前拿走所有東西」就可以完成這項工作。我對'word2vec'完全不瞭解,但是看到它也會很棒! – muammar

回答

6

您可以通過str.split生成的密鑰使用groupby到組字符串:

>>> 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需要首先排序。

+2

請注意,爲了使groupby工作,您需要使用與您分組相同的鍵來輸入輸入。在這種情況下,按照字典順序進行排序就足夠了(因爲關鍵只是查看前幾個字符),但在很多情況下卻不是。 – mgilson

+2

@mgilson真的,這就是爲什麼'sorted'被調用。因爲在這種情況下,沒有必要指定鍵排序我用最短和最簡單的答案去。 – niemmi

+0

@niemmi Holy s !!!!有用!。我不知道'groupby'函數。我真的非常感謝你,我會殺死自己...... – muammar