簡體   English   中英

比較兩個列表以返回一個列表,其中所有元素都為0,除了那些在保持索引時匹配的列表?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM