Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 比较两个列表以返回一个列表,其中所有元素均为0,但保留索引时匹配的元素除外?_Python_Python 3.x_List - Fatal编程技术网

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

Python 比较两个列表以返回一个列表,其中所有元素均为0,但保留索引时匹配的元素除外?,python,python-3.x,list,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] 我事先不知道这两个列表中的数字元素 我尝试了循环,但是 ['0' for x in a if x not in b] 它将删除2的所有实例。我只想删除一次(目前在b中出现一次)。我需要在上面的循环中添加一个条件,以保持匹配

我有点被这件事困住了:

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]
我事先不知道这两个列表中的数字元素

我尝试了
循环,但是

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

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

以下将起作用:

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]

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

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

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

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]

[b.pop(b.index(x))如果b中的x,则b中的x为0]
@Ev.Kounis恶心。有副作用和二次复杂性的列表理解?不用了,谢谢。你能把这个作为答案贴出来,这样我就可以投反对票了吗?如果我们设置
a=[1,2]
b=[1]
,那么
c=[0,1]
会是一个有效的输出吗?@Aran Fey,不会。我必须将此列表输入到
df
列中,并将其与前面列的值进行匹配。谢谢。这很好用。只是想知道,并等待看看它是否可以在一个简单的一行完成。另一个帖子被删除,但似乎使用集,然后做必要的。元组不是我真正想要使用的东西。更新了一个更好的linerNice。“集合允许非常有效的成员资格测试”:这是因为所有元素都是可散列的吗?@JacquesGaudin。在一般情况下,集合中的成员资格测试只是一个散列操作,后跟一个模来计算索引,然后检查该索引处的bucket是否为空。(所有这些都是
O(1)
)在列表中,您必须迭代列表中的所有元素,直到找到一个匹配的元素,即
O(n)