python 遍历两个列表并比较元素
我有两个列表,比如 x = [1,2,3,4,4,5,6,7,7] y = [3,4,5,6,7,8,9,10]
。我想要遍历这两个列表,并比较里面的元素。对于那些相同的元素,我想调用一个函数,并把它们从列表中删除。在这个例子中,最后我应该得到 x = [1,2]
和 y = [8,9,10]
。使用集合(Sets)来解决这个问题不行,因为我的数据类型和比较方式不适合。
for i in x:
for j in y:
if i ==j:
callsomefunction(i,j)
remove i, j from x and y respectively
4 个回答
1
试试这个:
for i in x:
if i in y:
callsomefunction(i)
x.remove(i)
y.remove(i)
编辑:更新了答案
3
好的,忽略我之前的帖子,我没注意到你提到集合不适用的地方。
不过,如果你愿意花点时间,可以考虑使用类,这样运算符就能像预期那样正常工作。
我觉得最“符合Python风格”的做法是使用集合。你可以这样做:
x = set([1,2,3,4,4,5,6,7,7])
y = set([3,4,5,6,7,8,9,10])
for item in x.intersection(y): #y.intersection(x) is fine too.
my_function(item) #You could use my_function(item, item) if that's what your function requires
x.remove(item)
y.remove(item)
我认为在性能方面,集合比列表更高效,尤其是处理这类工作时(尽管这可能不是你最关心的事情)。
顺便提一下,你也可以使用:
x,y = x.difference(y), y.difference(x)
这样做实际上会从x和y中移除那些同时在x和y中的项目。
4
编辑:在发现提问者只是不了解 __hash__
这个概念后,我在评论中提供了以下信息:
要使用集合(sets),需要实现
__hash__
方法。所以如果obj1 == obj2
当且仅当obj1.a == obj2.a
且obj1.b == obj2.b
时,__hash__
应该写成return hash((self.a, self.b))
,这样你的集合就能正常工作了。
这解决了他们的问题,他们开始使用集合了。
这部分内容现在已经过时,但仍然是正确的(虽然效率很低),所以我还是把它留在这里。
这段代码可以实现你想要的功能。最后,newx
和 newy
是 x
和 y
中不重叠的项目。
x = [1,2,3,4,4,5,6,7,7]
y = [3,4,5,6,7,8,9,10]
# you can leave out bad and just compare against
# x at the end if memory is more important than speed
newx, bad, newy = [], [], []
for i in x:
if i in y:
callsomefunction(i)
bad.append(i)
else:
newx.append(i)
for i in y:
if i not in bad:
newy.append(i)
print newx
print newy
不过,我知道即使不看你的代码,这种做法也是错误的。你当然可以用集合来完成这个,但如果你不想这样做,那就随你了。