2017-06-06 83 views
-2

我有一個字符串列表:在列表中找到類似的字符串(在不同的順序相同的話)

listA = [u'hour block', u'block hour', u'package hour', u'hour block hour'] 

我想尋找類似的所有字符串(即,從上面的例子'hour block''block hour')並且僅包含兩個中第一個出現的字符串(即在這種情況下爲'hour block'),其餘字符串按其順序出現。

因此,的輸出上面應該是:

[u'hour block', u'package hour', u'hour block hour'] 

我想在以下條款:

>>> for x in listA: 
...  y = x.split() 

不過,我想不通我怎麼比較每最佳列表中的字符串的單詞?

+2

由呈三角你的意思是完全一樣的話,只是順序不同?然後使用設置.... –

+0

您必須先定義「相似」。 – DyZ

+0

@JoranBeasley是的 – Arman

回答

2

不是最乾淨的解決方案,但它完成了工作。

listB = [y.split() for y in listA] 
listC = [] 
for i, l1 in enumerate(listB[::-1]): 
    flag = 0 
    for j, l2 in enumerate(listB[::-1][i + 1:]): 
     if len(l1) == len(l2) and set(l1) == set(l2): 
      flag = 1 
      break 
    if flag == 0: 
     listC.append(l1) 

listC = [' '.join(c) for c in listC[::-1]] 
print listC 

輸出:

[u'hour block', u'package hour', u'hour block hour'] 
+1

@Arman也是一個很好的解決方案。只要檢查一下你是否希望「塊時間塊」和「小時塊時間」相似或不相似。 –

+0

@ Y.Luo這是一個很好的呼喚。我肯定會認爲它們也是相似的。 – Arman

+0

@Arman你最好根據具體情況處理這些情況。 –

0

您可以使用setfrozenset製作獨特的項目。嘗試以下

listA = [u'hour block', u'block hour', u'package hour', u'hour block hour'] 

sets = set() 
unique = [] 

for item in listA: 
    splitted = item.split() 

    # Storing set of items(unique) and its count for comparision. 
    # hour block and hour block hour gives same set, so length is required 
    s = frozenset({ frozenset(item.split()), len(item.split()) }) 
    if s not in sets: 
     unique.append(item) 
    sets.add(s) 


print(unique) 

輸出['hour block', 'package hour', 'hour block hour']

相關問題