比较两个列表以返回一个列表,其中所有元素都为0,但保留索引时匹配的列表除外?

时间:2018-06-05 10:46:02

标签: python python-3.x list

我有点困惑于此:

a = [1,2,3,2,4,5]
b = [2,5]

我想比较两个列表并生成一个列表,其中包含与a相同的项目,但是b中不会出现的任何项目设置为0.有效输出将是这些:

c = [0,2,0,0,0,5]
# or
c = [0,0,0,2,0,5]

我不会事先知道任何一个列表中的数字元素。

我尝试了for循环但是

['0' for x in a if x not in b]

它删除了所有2的实例。我只想删除一次(它暂时在b中出现一次)。我需要在上面的loop中添加一个条件,以保持匹配的元素。

3 个答案:

答案 0 :(得分:4)

以下方法可行:

a = [1,2,3,2,4,5]
b = [2, 5]

output = []

for x in a:
    if x in b:
        b.remove(x)
        output.append(x)
    else:
        output.append(0)

或单行,使用b.remove(x)返回None的事实:

a = [1,2,3,2,4,5]
b = {2, 5}

output = [(b.remove(x) or x) if x in b else 0 for x in a]

答案 1 :(得分:2)

如果b中的元素是唯一的,最好使用set,因为集合允许非常有效的成员资格测试:

a = [1,2,3,2,4,5]
b = {2, 5}  # make this a set

result = []
for num in a:
    # If this number occurs in b, remove it from b.
    # Otherwise, append a 0.
    if num in b:
        b.remove(num)
        result.append(num)
    else:
        result.append(0)

# result: [0, 2, 0, 0, 0, 5]

如果b可以包含重复项,则可以使用Counter替换该集合,该{{3}}表示多重集:

import collections

a = [1,2,3,2,4,5]
b = collections.Counter([2, 2, 5])

result = []
for num in a:
    if b[num] > 0:
        b[num] -= 1
        result.append(num)
    else:
        result.append(0)

# result: [0, 2, 0, 2, 0, 5]

答案 2 :(得分:1)

这是使用set的单向方式。下行是list复制操作和初始set转换。上行是O(1)删除和查找操作。

a = [1,2,3,2,4,5]
b = [2,5]

b_set = set(b)
c = a.copy()

for i in range(len(c)):
    if c[i] in b_set:
        b_set.remove(c[i])
    else:
        c[i] = 0

print(c)

[0, 2, 0, 0, 0, 5]