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

Python 比较两个列表,只打印差异?(XORing两个列表),python,python-2.7,Python,Python 2.7,我试图创建一个函数,它接受两个列表,并返回只有两个列表差异的列表 例如: 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]:

我试图创建一个函数,它接受两个列表,并返回只有两个列表差异的列表

例如:

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])
def xor(列表1、列表2): 列表3=列表1+列表2 对于范围(0,len(列表3))中的i: x=列表3[i] y=i
当y>0和x注意:这真的是不和谐的,只能用作家庭作业答案:)

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

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

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

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

4) 否则您会发现一个重复的,高级Aitr和Bitr使用集更好

>>> 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)
这两种说法是相同的。但后者更为明确


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

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

[a for a in list1+list2 if (a not in list1) or (a not in list2)]
您可以像现在这样通过显式循环元素轻松地将其转换为更非语法化的代码,但老实说,我看不出有什么意义(这并不重要):


简单,但不是特别有效:)

或者“只是循环”


这段代码的工作原理是假设您拥有已排序的列表。它在线性时间内工作,而不像其他给出的许多解决方案那样是二次的

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]))
def差异(sl0、sl1): i0,i1=0,0 当i0试试这个

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

非家庭作业的回答很好,但“我不能使用任何特殊模块,、排序、设置或任何东西,基本上只是循环。”如果我们使用集合,为什么不简单地
set(a)^set(b)
?@DSM谢谢,你的建议更好。我只是忘了语法。实际上我和你一样喜欢对称差异,但我更喜欢你原来的长版本。但在我发表评论的同时,你把它改成了对称的@Sheng的更新,我们可以通过简单的list(set(a)^set(b))#将其转换为list返回一个list我想我知道它在做什么,但是我如何将其转换为一个完整的循环,以及如何将该循环添加到原始函数中,或者该循环是否能够独立工作…这是一个单行程序,它执行您正在创建的函数。。。循环遍历list1+list2元素x,有两个if:1。如果元素位于列表1中,则使flag1=True,2。如果元素位于列表2中,则使flag2=True;如果(flag1和flag2)!=如果为True且x不在outputlist中,则将其添加到outputlist。@user2314520 sashkello的意思是,任何列表理解都相当于对iterable项的
for
循环,如果所述项符合条件,则将其添加到新列表中,然后使用结果列表。@user2314520,我添加了一个长版本。@user2314520:另一种方法是:它查找两个列表的并集,而不包括列表的交集(即,它查找)。联合是
list1+list2
。如果
x
list1
中,
x
list2
中,则元素
x
位于交叉点;您希望排除这些元素,因此条件应相反:
not(列表1中的x和列表2中的x)
,这相当于
x not in list1或x not in list2
。把它放在一起,代码< xOrthList= = [x(in List1+List2)如果x不在List1或x不在List2] 。为什么你认为你的方法是非Pyththic的?@ Gnbbor看到Sheng的答案,因为我认为PythOnic依赖于所有元素都是可hhhabl的。(可能是)。+1表示线性解。总的来说,基本上是执行。
>>> 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]
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]))
    a = [1,2,5,7,9]
    b = [1,2,4,8,9]
 print set(a).symmetric_difference(set(b))