簡體   English   中英

從兩個列表中刪除一個元素

[英]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.compressfilter的良好用例:

list_a[:] = compress(list_a, list_b)
list_b[:] = filter(None, list_b)

在線試用!

可能有 100 種方法可以做到這一點,我相信您會得到不同的回應。 如果你有興趣學習這個,你應該嘗試一些......

  1. 在索引上使用 for 循環。 在循環之前,制作 2 個新列表,如list_a_newlist_b_new ,然后使用 for 循環遍歷原始list_b的索引。 測試object你出去。 使用條件語句。 如果 object 不為零,則從原始列表中獲取相同索引 position 的項目,並通過append()將其添加到兩個新結果中

  2. 對兩個新列表使用列表理解並在內部使用enumerate(list_b)獲取相同類型的信息,看看是否可以對兩個新列表進行列表理解

  3. 做一個“面具”。 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.

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