比较两个列表,只打印差异? (XORing两个列表)

时间:2013-05-01 04:26:54

标签: python python-2.7

我正在尝试创建一个接收2个列表的函数,并返回仅具有两个列表差异的列表。

示例:

a = [1,2,5,7,9]
b = [1,2,4,8,9]

结果应打印[4,5,7,8]

到目前为止的功能:

def xor(list1, list2):
    list3=list1+list2
    for i in range(0, len(list3)):
        x=list3[i]
        y=i
        while y>0 and x<list3[y-1]:
            list3[y]=list3[y-1]
            y=y-1
        list3[y]=x

        last=list3[-1]
    for i in range(len(list3) -2, -1, -1):
        if last==list3[i]:
            del list3[i]
        else:
            last=list3[i]

    return list3 
print xor([1,2,5,7,8],[1,2,4,8,9])

第一个for循环对其进行排序,第二个删除重复项。问题是结果是 [1,2,4,5,7,8,9]不是[4,5,7,8],所以它没有完全删除重复项?我可以添加什么来做到这一点。 我不能使用任何特殊模块,.sort,set或任何东西,基本上只是循环。

6 个答案:

答案 0 :(得分:15)

如果元素存在于一个元素中而另一个元素中不存在,则您基本上希望将元素添加到新列表中。这是一个紧凑的循环,可以做到这一点。对于两个列表中的每个元素(用list1+list2连接它们),我们添加元素,如果它不存在于其中一个:

[a for a in list1+list2 if (a not in list1) or (a not in list2)]

您可以轻松地将其转换为更加unPythonic的代码,并通过元素显式循环,但老实说,我没有看到一点(不重要):

def xor(list1, list2):
    outputlist = []
    list3 = list1 + list2
    for i in range(0, len(list3)):
        if ((list3[i] not in list1) or (list3[i] not in list2)) and (list3[i] not in outputlist):
             outputlist[len(outputlist):] = [list3[i]]
    return outputlist

答案 1 :(得分:13)

使用set更好

>>> a = [1,2,5,7,9]
>>> b = [1,2,4,8,9]
>>> set(a).symmetric_difference(b)
{4, 5, 7, 8}

感谢@DSM,更好的句子是:

>>> set(a)^set(b)

这两个陈述是一样的。但后者更清楚。

更新:抱歉,我没有看到最后一个要求:无法使用set。据我所知,@ sashkello提供的解决方案是最好的。

答案 2 :(得分:5)

注意:这实际上是非语音的,只能作为家庭作业的答案:)

对两个列表进行排序后,您可以通过执行以下操作找到重复项:

1)将迭代器放在A和B的开头

2)如果Aitr大于Bitr,则在将Bitr的值放入返回列表后推进Bitr

3)否则,如果Bitr大于Aitr,则在将Aitr的值放入返回列表后提前Aiter

4)否则你找到了重复的,提前Aitr和Bitr

答案 3 :(得分:3)

假设您已经排序列表,此代码可以正常工作。它在线性时间内工作,而不像其他许多解决方案那样是二次的。

def diff(sl0, sl1):
    i0, i1 = 0, 0
    while i0 < len(sl0) and i1 < len(sl1):
        if sl0[i0] == sl1[i1]:
            i0 += 1
            i1 += 1
        elif sl0[i0] < sl1[i1]:
            yield sl0[i0]
            i0 += 1
        else:
            yield sl1[i1]
            i1 += 1
    for i in xrange(i0, len(sl0)):
        yield sl0[i]
    for i in xrange(i1, len(sl1)):
        yield sl1[i]

print list(diff([1,2,5,7,9], [1,2,4,8,9]))

答案 4 :(得分:3)

试试这个,

    a = [1,2,5,7,9]
    b = [1,2,4,8,9]
 print set(a).symmetric_difference(set(b))

答案 5 :(得分:1)

简单但不是特别有效:)

>>> a = [1,2,5,7,9]
>>> b = [1,2,4,8,9]
>>> [i for i in a+b if (a+b).count(i)==1]
[5, 7, 4, 8]

或者使用&#34;只是循环&#34;

>>> res = []
>>> for i in a+b:
...  c = 0
...  for j in a+b:
...   if i==j:
...    c += 1
...  if c == 1:
...   res.append(i)
... 
>>> res
[5, 7, 4, 8]