[英]Compare two lists to return a list with all elements as 0 except the ones which matched while keeping index?
我有點困惑於此:
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
添加一個條件來保持匹配的元素。
以下將有效:
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
中的元素是唯一的,那么最好使用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
替換該集合,該Counter
代表多重集:
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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.