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)
。