有沒有一種pythonic方法可以將元素從一個串列洗掉到另一個串列?(不洗掉所有重復項)
例如,給定 [1, 2, 2, 3, 3, 3] (原始串列)和 [1, 2, 3] (要洗掉的元素)。它將回傳 [2, 3, 3] 我們可以假設兩個給定的串列總是有效的。“待洗掉”串列中的元素將在原始串列中。
謝謝!
uj5u.com熱心網友回復:
我會使用要洗掉的元素的計數器。
所以,像
from collections import Counter
data = [1, 2, 2, 3, 3, 3]
to_be_removed = [1, 2, 3, 3] # notice the extra 3
counts = Counter(to_be_removed)
new_data = []
for x in data:
if counts[x]:
counts[x] -= 1
else:
new_data.append(x)
print(new_data)
這個解決方案是線性時間/空間。如果您確實需要修改串列(這是代碼氣味,IMO),您將需要二次時間
請注意,如果您實際上只想要一個多重集 - 即您可能一直都在使用計數器,請考慮:
>>> Counter(data) - Counter(to_be_removed)
Counter({2: 1, 3: 1})
uj5u.com熱心網友回復:
解決這個問題的另一種可能方法。不確定它是否 Pythonic,但它只是回答了 OP 的詢問并進行了in-place更改/洗掉 - 回傳修改后的相同原始串列。
好訊息是整個操作是 O(n) 并且不需要額外的存盤空間。
data = [1, 2, 2, 3, 3]
to_be_removed = [1, 2, 3, 4] # notes - extra 4 is not in data
for i in range(len(data)-1, -1, -1): # working from the backward
if data[i] in set(to_be_removed): # faster search O(1)
to_be_removed.remove(data[i])
data.remove(data[i]) # in-place modify the list -it's fine, because working backward
print(data) # [2, 3]
另一組資料(Test2):
data = [1, 2, 2, 3, 1, 3, 3]
# x x x
to_be_removed = [1, 2, 3] #
.... running the same code above...
print(data) # [2, 1, 3, 3]
uj5u.com熱心網友回復:
這應該作業
original = [1, 2, 2, 3, 3, 3]
remove = [1, 2, 3]
for i, x in enumerate(original):
if x in remove:
original.pop(i)
print(original)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/490573.html
下一篇:字典是如何在這里實作的?
