请原谅我,如果这是一个愚蠢的问题,我已尽最大努力去查看,但没有成功,我绝不是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']]
第二只“兔子”没有被添加到比赛列表中,它仍然保留在原件中。这里发生了什么,我没有得到?
答案 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]