假设我有2个列表,如下所示。我正在比较两个列表的项目,如果list1的项目中存在list1的第一项,则将list1的项目替换为list2的匹配项目,然后从list2中删除该项目。然后它应该移动到list1的第二项,依此类推。我有以下代码是不正确的但我无法弄清楚的方式。两个列表中的项目数可能不同。
list1 = ["abc", "abc", "abc", "xyz", "xyz"]
list2= ["abc123", "abc456", "abc000", "xyz111"]
for i in list1:
for j in list2:
if i in j:
i.replace(i, j)
list2.remove(j)
continue
else:
continue
结果应为:
list1 = ["abc123", "abc456", "abc000", "xyz111", "xyz"]
答案 0 :(得分:4)
我会使用list comprehension和[i]zip_longest
:
from itertools import izip_longest # zip_longest for 3.x
list1 = [b if a in b else a
for a, b in izip_longest(list1, list2, fillvalue="")]
list2 = [a for a in list2 if a not in list1]
这使得第一步中两个列表之间的索引保持一致(与remove
不同),然后清除list2
。
答案 1 :(得分:1)
执行for i in list1
时,您将获得列表的元素,而不是列表的位置。
>>> for i in list1:
... print(type(i))
...
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
<class 'str'>
要正常工作,您应该在此处执行此类操作并更改位置
>>> for i in range(len(list1)):
... print(i)
...
0
1
2
3
4
答案 2 :(得分:1)
这是另一种解决方案:
>>> list1 = ["abc", "abc", "abc", "xyz", "xyz"]
>>> list2= ["abc123", "abc456", "abc000", "xyz111"]
>>>
>>> [ list2[i] if i < len(list2) and list2[i].startswith(elem)
... else elem
... for i, elem in enumerate(list1)]
['abc123', 'abc456', 'abc000', 'xyz111', 'xyz']
答案 3 :(得分:1)
这是代码:
>>> for list in list1:
... for a in list2:
... if list in a:
... list1[list1.index(list)] = a
... del list2[list2.index(a)]
...
>>>
>>> print list1
['abc123', 'abc000', 'abc456', 'xyz111', 'xyz']
>>> print list2
[]
>>>