[英]Remove an element from two lists
我有 list_a 和 list_b。 這兩個列表都有一個順序的項目。
每次我在 list_b 中遇到 0 時,我都想從 list_a 和 list_b 中刪除與該索引關聯的條目。 我不知道該怎么做。
# Before modification
list_a = [ '2019', '2020', '2021', '2022', '2023' ]
list_b = [ 40, 0, 30, 0, 9 ]
#After modification
list_a = [ '2019', '2021', '2023' ]
list_b = [ 40, 30, 9 ]
關於如何處理這個問題的任何線索?
itertools.compress和filter的良好用例:
list_a[:] = compress(list_a, list_b)
list_b[:] = filter(None, list_b)
可能有 100 種方法可以做到這一點,我相信您會得到不同的回應。 如果你有興趣學習這個,你應該嘗試一些......
在索引上使用 for 循環。 在循環之前,制作 2 個新列表,如list_a_new
、 list_b_new
,然后使用 for 循環遍歷原始list_b
的索引。 測試object你出去。 使用條件語句。 如果 object 不為零,則從原始列表中獲取相同索引 position 的項目,並通過append()
將其添加到兩個新結果中
對兩個新列表使用列表理解並在內部使用enumerate(list_b)
獲取相同類型的信息,看看是否可以對兩個新列表進行列表理解
做一個“面具”。 numpy
可以做到這一點,或者您可以自己制作,也許可以在list_b
上再次使用列表理解來制作布爾掩碼,例如[False, True, False, True, ...]
使用該掩碼作為另一個列表理解的基礎獲取 new_a 和 new_b
如果遇到困難,請嘗試幾個並編輯您的帖子。 你會提高你的技能。
正如其他用戶所提到的,有很多方法
list_a2 = [list_a[i] for i in range(len(list_b)) if list_b[i]!=0]
list_b2 = [list_b[i] for i in range(len(list_b)) if list_b[i]!=0]
下面是一個解決方案,它使用傳統的 for 循環迭代list_a
中的項(使用zip()
)與list_b
中的項配對:
new_a = []
new_b = []
for a, b in zip(list_a, list_b):
if b != 0:
new_a.append(a)
new_b.append(b)
或者您可以使用幾個列表理解:
new_a = [a for a, b in zip(list_a, list_b) if b != 0]
new_b = [b for b in list_b if b != 0]
您可以在一行中完成所有操作,但可讀性會受到影響:
new_a, new_b = map(list, zip(*((a, b) for a, b in zip(list_a, list_b) if b != 0)))
如果您不介意修改您的原始列表,它會變得不那么不可讀:
list_a[:], list_b[:] = zip(*((a, b) for a, b in zip(list_a, list_b) if b != 0))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.