我有点困惑于此:
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
中添加一个条件,以保持匹配的元素。
答案 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]