如果条件匹配,则按另一个列表的项替换列表项

时间:2014-05-23 12:12:56

标签: python

假设我有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"]

4 个答案:

答案 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
[]
>>>