比较python3中列表的元组内元素的问题

时间:2017-08-22 20:52:40

标签: python python-3.x list tuples

我试图比较列表元组中的元素,只提取不常见的值但由于某种原因它返回整个组合。例如,如果我传递这样的值:

@Test
public printTest()   {
   System.out.println("myprint");
}

然后它应该返回

[(3,2), (2,4)]

这就是我的尝试:

[(3,4)]

我试图构建一个更通用的代码来处理不同类型的输入,但它无法处理所有情况。它给出了例如[(3,2),(2,4)]的单一比较的可能性。它给出了3 4和4 3作为输出。

a=[]
for i in range(len(l)):
    j=i+1
    for j in range(len(l)):
        print(i)
        print(j)
        if l[i][0]==l[j][0]:
            a.append((l[i][1],l[j][1]))
            print(a)
        elif l[i][0]==l[j][1]:
            a.append((l[i][1],l[j][0]))
            print(a)
        elif l[i][1]==l[j][0]:    
            a.append((l[i][0],l[j][1]))
            print(a)
        elif l[i][1]==l[j][1]:
            a.append((l[i][0],l[j][0]))
            print(a)

是否可以使用更优化的代码或列表解析。我是新手并且学习这个 这就是我的尝试。

Sample inputs tried
>>onehop([(2,3),(1,2)]) input 
>>[(1, 3)] expected output
>>onehop([(2,3),(1,2),(3,1),(1,3),(3,2),(2,4),(4,1)]) input
>>[(1, 2), (1, 3), (1, 4), (2, 1), (3, 2), (3, 4), (4, 2), (4, 3)] output
>>onehop([(1,2),(3,4),(5,6)]) input
>>[] expected output
>>onehop([(1,2),(2,1)]) input
>>[ ] expected output
>>onehop([(1,2)]) input
>>[ ] expected output
>>onehop([(1,3),(1,2),(2,3),(2,1),(3,2),(3,1)]) input
>>[(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)] expected output

2 个答案:

答案 0 :(得分:0)

这似乎是一种疏忽,但你设置j并立即用for - 循环覆盖它,这解释了为什么你得到所有组合:它还将每个元素与自身进行比较。

如果您插入手动计算的j作为下限,它似乎适用于您的情况:

l = [(3,2),(2,4)]
a = []
for i in range(len(l)):
    for j in range(i+1, len(l)):  # changed!
        if l[i][0]==l[j][0]:
            a.append((l[i][1],l[j][1]))
        elif l[i][0]==l[j][1]:
            a.append((l[i][1],l[j][0]))
        elif l[i][1]==l[j][0]:    
            a.append((l[i][0],l[j][1]))
        elif l[i][1]==l[j][1]:
            a.append((l[i][0],l[j][0]))
print(a)
# [(3, 4)]

可能您可以使用set操作来简化代码(并使其更快),如@Bill Bell指出的那样:

  

例如,tuple(set((3,2)).symmetric_difference(set((2,4))))会产生(3, 4)

答案 1 :(得分:0)

def remove_dup(L):
    if L == ():
        return ()
    else:
        return L[0] + remove_dup(tuple(map(lambda li: tuple(filter(lambda x: x not in L[0], li)), L[1:])))

print(remove_dup([(3,2),(2,4)]))
-->
(3, 2, 4)

print(remove_dup([(3,2,9),(2,4),(4,3,8,9),(9,7),(8,)]))
-->
(3, 2, 9, 4, 8, 7)