匹配python中列表中的不同项

时间:2013-04-11 16:57:25

标签: python

什么是在Python 2.7中匹配列表中不同项目的最佳方法,我有

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, 6 )和(B, 7 )但不是(A, 6 )和(E, 6

2 个答案:

答案 0 :(得分: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)功能。您可以按照每个元素中的set的长度对matching列表进行排序。 (matching.sort(lambda a,b: len(b)-len(a))

答案 1 :(得分: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