python在比较项目时迭代两个列表

时间:2011-08-19 13:27:50

标签: python list

我有两个列表,例如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]。由于我的数据类型和比较运算符,集合不适用于此问题。

for i in x:
  for j in y:
    if i ==j:
       callsomefunction(i,j)
       remove i, j from x and y respectively

4 个答案:

答案 0 :(得分:4)

修改:在发现提出问题的人根本不知道__hash__后,我在评论中提供了此信息:

  

要使用集合,请实施__hash__。因此,如果obj1 == obj2 obj1.a == obj2.a and ob1.b == obj2.b __hash__return hash((self.a, self.b))应为newx,您的设置将按预期运行。

这解决了他们的问题,他们转而使用套装。

这个答案的其余部分现在已经过时了,但它仍然是正确的(但非常低效),所以我会把它留在这里。


此代码可以满足您的需求。最后,newyxyx = [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 的非重叠项目。

{{1}}

但是,我知道甚至没有看到你的代码,这是错误的方法。你当然可以用套装来做,但如果你不想这样做,那取决于你。

答案 1 :(得分:3)

好的,丢弃我的帖子,我没有看到你提到这些套装不起作用的重点。

尽管如此,如果你可以做一些工作,你可能想要使用类,以便运算符按预期工作

我认为最“蟒蛇式”的做法是使用套装。 然后你可以这样做:

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中的项目。

答案 2 :(得分:1)

试试这个:

for i in x:
    if i in y:
        callsomefunction(i)
        x.remove(i)
        y.remove(i)

编辑:更新回答

答案 3 :(得分:-1)

怎么样:

import itertools
x = [1,2,3,4,4,5,6,7,7] 
y = [3,4,5,6,7,8,9,10]
output = map(somefunction, itertools.product(x,y))