2013-06-05 28 views
1

我正在使用python 2.7,我試圖在列表列表中找到基於兩個值的重複列表。 例如python在列表中找到重複列表

list= [[a,x,y,2], [b,xx,yy,2], [c,xxx,yyy,3],[a,yx,yx,2]] 

outcome [[a,xyx,yyx,2], [b,xx,yy,2], [c,xxx,yyy,3]] 

所以基於該值的和2中,加入其他值

任何建議??

謝謝 問候

+0

什麼解決方案,你已經嘗試?也許這個模塊可以幫助你:http://docs.python.org/library/itertools.html?highlight=itertools#module-itertools –

+0

上一個問題的答案也應該適用於這一個。簡而言之:迭代外部列表,從內部列表中創建第一個和最後一個值的元組,然後檢查該元組是否在一組可見對中。 – Blckknght

+0

@Blckknght - 這有些不同。在這裏,OP想要合併列表,所以'dict'比'set'更合適,因爲dict使您可以輕鬆處理要合併的列表。 – mgilson

回答

1
from collections import OrderedDict 
lis = [['a','x','y',2], ['b','xx','yy',2], ['c','xxx','yyy',3],['a','yx','yx',2]] 
dic = OrderedDict() 
for x in lis: 
    key = (x[0],x[-1]) 
    if key not in dic: 
     dic[key] = x[1:-1] 
    else: 
     val = dic[key] 
     dic[key] = [a+b for a,b in zip(val,x[1:-1])] 

print [[k[0]] + v + [k[1]] for k,v in dic.items()] 

輸出:

[['a', 'xyx', 'yyx', 2], ['b', 'xx', 'yy', 2], ['c', 'xxx', 'yyy', 3]] 
2

我想你可以使用一個字典,如果順序並不重要:

from operator import itemgetter 
getter = itemgetter(0,-1) 

def merge(lst1,lst2): 
    return [lst1[0],lst1[1]+lst2[1],lst1[2]+lst2[2],lst1[3]] 


d = {} 
for sublist in lst: 
    t = getter(sublist) 
    if t not in d: 
     d[t] = sublist 
    else: 
     d[t] = merge(sublist,d[t]) 

print d.values() 

如果訂單的問題,你可以使用一個collections.OrderedDict代替。

+0

它應該是'(0,-1)' – jamylak

+2

@jamylak - 你就是。我昨天下午花了比平常更多時間和Fortran一起工​​作。顯然我忘了把我的想法一直轉換回0索引。 :) – mgilson

+1

你在哪裏發現2013年的Fortran遺留產品? –