[英]How to filter the list elements within list based on another list in python?
[英]How to remove elements in a list based on another list in python, without loops?
我有兩個相等長度的列表:
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,而不使用循環?
一種方法是使用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]
沒有顯式循環,創建兩個? 當然,如果我們使用臨時對象:
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循環會更明顯一些:
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}
如果你真的想避免循環,你可以使用遞歸函數:
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)
請注意,這是使用遞歸函數的一個非常糟糕的理由,你肯定應該使用上面的其他建議。
非常感謝! 對於有同樣問題的其他人:
我最終得到以下代碼:
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
更好的想法可能是直接使用數據框來匹配每個元素與自己的標簽。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.