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

2024-04-26 15:15:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有点被困在这个问题上:

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中添加一个条件来保持匹配的元素。你知道吗


Tags: or实例inloop元素列表forif
3条回答

以下方法可行:

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]

如果b中的元素是唯一的,最好使用^{}来完成,因为集合允许非常有效的成员身份测试:

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可以包含重复项,则可以用表示多集的^{}替换该集:

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]

这里有一种使用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]

相关问题 更多 >