我正在尝试创建一个接收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或任何东西,基本上只是循环。
答案 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]