2016-07-30 33 views
2

我具有相等長度的兩個列表:如何基於python中的另一個列表刪除列表中的元素,沒有循環?

list_a = ['a','b','c','d'] 
list_b = [-6.3, 3.1, 0.5, 4.1] 

我想刪除的元素<在list_b 0.7,同時去除從list_a相應元素,即

list_a_2 = ['b','d'] 
list_b_2 = [3.1, 4.1] 

我知道所述第二列表,

list_b_2 = [item for item in hem if item > 0.7]. 

但是有沒有一種列表思考的方式來獲得list_a_2,而不使用循環?

+0

不使用循環?不是真的......即使沒有明確寫出循環,也可能會在某處使用循環 –

+0

嘗試同時迭代兩個循環,將合格項過濾到結果列表(或兩個)中。 – GManNickG

回答

6

一種方法是使用zip

list_a_2, list_b_2 = zip(*[(a, b) for a, b in zip(list_a, list_b) if b > 0.7])  
list_a_2 
# ('b', 'd') 

list_b_2 
# (3.1, 4.1) 

如果一個for循環更適合,您可以創建兩個空列表和有條件的價值附加到他們:

list_a_2, list_b_2 = [], [] 
for a, b in zip(list_a, list_b): 
    if b > 0.7: 
     list_a_2.append(a) 
     list_b_2.append(b) 

list_a_2 
# ['b', 'd'] 

list_b_2 
# [3.1, 4.1] 
+0

感謝您的幫助。 –

+0

使用生成器表達式使其變得很好懶! –

1

沒有明確的循環,創建兩個?當然,如果我們使用一個臨時對象:

list_a = ['a','b','c','d'] 
list_b = [-6.3, 3.1, 0.5, 4.1] 
tmp = zip(a, b) 
list_a_2 = [x[0] for x in tmp if x[1] > 0.7] 
list_b_2 = [x[1] for x in tmp if x[1] > 0.7] 
del tmp 

但使用實際的循環會更明顯一點:

for idx, value in enumerate(list_b): 
    if value =< 0.7: 
     list_a.pop(idx) 
     list_b.pop(idx) 

但你還是管理映射兩個列表(基本上)鍵值。 這是一本字典的用途!整合這些清單,並與一些字典解析創建子集:

{x:y for x, y in zip(list_a, list_b) if y > 0.7} 
+0

3種方法令人鼓舞!謝謝。 –

+0

我發現,通過使用包含3,828個元素的長列表的for循環,我無法立即刪除所有<0.7的元素。每次運行代碼時,列表的長度都會減少。只有四次跑完後,所有小於0.7的數字纔會被踢出。我可以避免這個問題嗎? –

+1

從循環中移除列表中的元素並不是一個好主意,這會導致問題發生。由於每次刪除元素,列表的長度都會發生變化,而您實際上會跳過某個元素而不檢查。 – Psidom

0

如果你真的想避免環路,您可以使用一個遞歸函數:

def unnecessarily_recursive_function(list_a,list_b): 
    try: 
     a = list_a.pop(0) 
     b = list_b.pop(0) 
     tmp_a, tmp_b = unnecessarily_recursive_function(list_a,list_b) 
     if b < 0.7: 
      return [a] + tmp_a, [b] + tmp_b 
     else: 
      return tmp_a, tmp_b 
    except IndexError: 
     return [],[] 

,你可以調用諸如:

list_a, list_b = unnecessarily_recursive_function(list_a, list_b) 

請注意,這是使用遞歸函數的一個非常糟糕的原因,您應該切實執行上述其他建議。

0

非常感謝!對於有同樣的問題,其他人:

我結束了下面的代碼:

list_a = ['a','b','c','d'] 
list_b = [-6.3, 3.1, 0.5, 4.1] 
tmp = zip(a, b) 
list_a_2 = [x[0] for x in tmp if x[1] > 0.7] 
list_b_2 = [x[1] for x in tmp if x[1] > 0.7] 
del tmp 

和更好的想法可能是直接用一個數據幀與自己品牌的每個元素相匹配。

相關問題