python 遍历两个列表并比较元素

8 投票
4 回答
18197 浏览
提问于 2025-04-16 23:57

我有两个列表,比如 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.aobj1.b == obj2.b 时,__hash__ 应该写成 return hash((self.a, self.b)),这样你的集合就能正常工作了。

这解决了他们的问题,他们开始使用集合了。

这部分内容现在已经过时,但仍然是正确的(虽然效率很低),所以我还是把它留在这里。


这段代码可以实现你想要的功能。最后,newxnewyxy 中不重叠的项目。

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

不过,我知道即使不看你的代码,这种做法也是错误的。你当然可以用集合来完成这个,但如果你不想这样做,那就随你了。

撰写回答