2013-12-12 43 views
0

列表中的類似項目的有效辦法,我有清單列表如下:找到在Python

list_1 = [[[1,a],[2,b]], [[3,c],[4,d]], [[1,a],[5,d]], [[8,r],[10,u]]] 

我試圖找到一個元素是否是此列表類似於其他元素。現在,我循環兩次,即每個元素,檢查其餘的。我的輸出是:

[[[1,a],[2,b]], [[1,a],[5,d]]] 

有沒有辦法更有效地做到這一點?

謝謝。

+1

定義'similar'? – thefourtheye

+0

在這種情況下,第一個[[1,a],[2,b]]和[[1,a],[5,d]]是相似的,因爲至少有一個元素是常見的......即, [1,a]是常見的 – visakh

+0

解決這個問題的最有效的方法可能是將數據結構丟棄並使用更合理的東西。 – roippi

回答

2

您可以使用itertools.combinationsany功能,這樣

from itertools import combinations 
for item in combinations(list_1, 2): 
    if any(i in item[1] for i in item[0]): 
     print item 

輸出

([[1, 'a'], [2, 'b']], [[1, 'a'], [5, 'd']]) 
1

我假設,通過類似的,你的意思是,該元件具有至少一個匹配對在它之內。在這種情況下,不是做一個嵌套的循環,你可以將每個元素映射成一個列表字典兩次(對於每個[number,str]對)。完成後,詞典中的每個鍵將映射到包含該鍵的元素列表(即,類似)。

示例代碼:

list_1 = [[[1,'a'],[2,'b']], [[3,'c'],[4,'d']], [[1,'a'],[5,'d']], [[8,'r'],[10,'u']]] 

d = {} 

for elt in list_1: 
    s0 = '%d%s' % (elt[0][0], elt[0][1]) 
    if s0 in d: 
     d[s0].append(elt) 
    else: 
     d[s0] = [elt] 

    s1 = '%d%s' % (elt[1][0], elt[1][1]) 
    if s1 in d: 
     d[s1].append(elt) 
    else: 
     d[s1] = [elt] 

for key in d.keys(): 
    print key, ':', d[key] 

輸出示例:

1a : [[[1, 'a'], [2, 'b']], [[1, 'a'], [5, 'd']]] 
8r : [[[8, 'r'], [10, 'u']]] 
2b : [[[1, 'a'], [2, 'b']]] 
3c : [[[3, 'c'], [4, 'd']]] 
5d : [[[1, 'a'], [5, 'd']]] 
4d : [[[3, 'c'], [4, 'd']]] 
10u : [[[8, 'r'], [10, 'u']]] 

任何長度> 1的字典條目具有類似的元件。這會將你的代碼的運行時複雜度降低到O(n),假設你有辦法獲得a,b,c等的字符串表示。