2013-04-11 46 views
0

請告訴我,以匹配在Python 2.7列表中的不同項目的最好方式,我有匹配列表內對不同的項目在python

list= [('A', 6L), ('B', 7L), ('C', 8L), ('D', 8L), ('E', 6L), ('F', 8L)] 

,我想這樣的

new list = ('A', 6L, 'B', 7L), ('C', 8L, 'E', 6L), ('D', 8L), ('F' 8L)] 
結果匹配

其中任何不匹配的項目是在這種情況下D和F列表的末尾。

編輯:通過匹配不同我的意思是加入每個元組(例如(A,6))與另一個元組,元組(例如, 6)是不一樣的。所以(A,)和(B,),而不是(A,)和(E,)

+9

對不起,我有*不知道*你的意思是'不同'在這裏。 –

+4

什麼是匹配標準? – Adrian

+0

已更新,使我的問題更加清晰 – DavidJB

回答

0

如果您想最大限度地提高匹配數量(與示例不同),您可以對列表進行排序並匹配兩端的項目。

import operator 
oldlist = [('A', 6L), ('B', 7L), ('C', 8L), ('D', 8L), ('E', 6L), ('F', 8L)] 
newlist = [] 

oldlist.sort(key=operator.itemgetter(1)) 
while oldlist and oldlist[0][1] != oldlist[-1][1]: 
    newlist.append(oldlist.pop(0) + oldlist.pop()) 
newlist.extend(oldlist) #unmatched items 
+0

謝謝,這似乎完美! – DavidJB

0

只要不有重複,這樣的事情應該工作:

available = set(your_original_list) 
matching = [] 
while len(available) > 0: 
    first = available.pop() 
    current_set = set() 
    current_set.add(first) 
    for possible_match in available.copy(): 
     if matches(first, possible_match): 
      current_set.add(possible_match) 
      available.remove(possible_match) 

    matching.append(current_set) 

當然,由您來實現matches(a, b)函數。您可以按照每個元素中設置的長度對matching列表進行排序。 (matching.sort(lambda a,b: len(b)-len(a))