差异混合列表

时间:2012-01-31 23:57:26

标签: python

请原谅我,如果这是一个愚蠢的问题,我已尽最大努力去查看,但没有成功,我绝不是Python专家。

我正在写一些东西到“diff”两个列表:基本上,比较2个列表并用常用值填充第三个列表,同时从原始的两个列表中删除它们。所以我写了这个:

list_1 = ["dog", "cat", "bird", "rabbit", "rabbit"]
list_2 = ["fly", "monkey", "bird", "rabbit", "bear", "rabbit"]
matches = []

for thing in list_1:
    while thing in list_2:
        list_1.pop(list_1.index(thing))
        popper = list_2.pop(list_2.index(thing))
        matches.append(popper)

哪个让我:

list_1:
['dog', 'cat']
list_2:
['fly', 'monkey', 'bear']
Matches:
['bird', 'rabbit', 'rabbit']

这正是我所期望/想要的......“兔子”出现两次,因为它在两个列表中两次。

然后使用相同的for循环,这个:

list_1 = ["dog", "cat", ["bird", "rabbit"], "rabbit"]
list_2 = ["fly", "monkey", ["bird", "rabbit"], "bear", "rabbit"]

得到我:

list_1:
['dog', 'cat', 'rabbit']
list_2:
['fly', 'monkey', 'bear', 'rabbit']
Matches:
[['bird', 'rabbit']]

第二只“兔子”没有被添加到比赛列表中,它仍然保留在原件中。这里发生了什么,我没有得到?

4 个答案:

答案 0 :(得分:2)

你应该考虑使用套装,它会简化你需要做的很多事情,例如:

set_1 = set(["dog", "cat", "bird", "rabbit", "rabbit"])
set_2 = set(["fly", "monkey", "bird", "rabbit", "bear", "rabbit"])

>>> set_1 & set_2   # elements common to both
set(['bird', 'rabbit'])
>>> set_1 - set_2   # elements in set_1 that are not in set_2
set(['dog', 'cat'])
>>> set_2 - set_1   # elements in set_2 that are not in set_1
set(['fly', 'monkey', 'bear'])

这里潜在的一个复杂因素是你只能在一个集合中放入可混合类型,所以对于你的第二个例子,你需要先将内部列表转换为元组:

set_1 = set(["dog", "cat", ("bird", "rabbit"), "rabbit"])
set_2 = set(["fly", "monkey", ("bird", "rabbit"), "bear", "rabbit"])

>>> set_1 & set_2
set([('bird', 'rabbit'), 'rabbit'])
>>> set_1 - set_2
set(['dog', 'cat'])
>>> set_2 - set_1
set(['fly', 'monkey', 'bear'])

答案 1 :(得分:1)

因为当你浏览一个列表并删除一个元素时,就说“n-th”,你的列表会变成“1”项更短,所以指针会转到“第n个”+ 1个元素你的新名单,这是你原来的“第n +”+ 2。你能做的就是你的for循环:

for thing in list_1[:]:
   blablabla

然后你循环浏览列表的副本,不会被这个问题困扰。

答案 2 :(得分:1)

在迭代编辑列表时遇到错误。

此代码中还存在一个可能致命的错误:

while thing in list_2:
    list_1.pop(list_1.index(thing))
如果ValueError的{​​{1}}时间比thing中的list_2多一倍,则

会导致list_1

答案 3 :(得分:0)

方法1:

list_1 = ['dog', 'cat']
list_2 = ['fly', 'monkey', 'bear']
matches = []
for i in list_1:
    if i not in list_2:
        matches.append(i)

方法2:

matches = [i for i in list_1 if i not in list_2]