我正在尋找從列表中刪除多個索引,並希望按內容對它們進行過濾。例如:從列表中刪除索引,如果它包含特定的值
L= [(1, 2, 3), (etc, etc, etc), (......)]
if L[i] == 1:
L[i] == nan
>>>L
[(nan), (etc, etc.......]
我知道這個代碼是不正確的,但它只是一個例子,幫助遍歷了我想做的事,任何幫助表示讚賞,感謝。
我正在尋找從列表中刪除多個索引,並希望按內容對它們進行過濾。例如:從列表中刪除索引,如果它包含特定的值
L= [(1, 2, 3), (etc, etc, etc), (......)]
if L[i] == 1:
L[i] == nan
>>>L
[(nan), (etc, etc.......]
我知道這個代碼是不正確的,但它只是一個例子,幫助遍歷了我想做的事,任何幫助表示讚賞,感謝。
您使用列表理解:
L = [float('nan') if el[0] == 1 else el for el in L]
的if .. else ..
部分稱爲conditional expression。
此用新列表替換列表。如果你有相同的列表多個引用,可以更換元素列表以代替片分配:
L[:] = [float('nan') if el[0] == 1 else el for el in L]
現在L
所有元素將與列表理解所產生的所有元素所取代。這兩種表達方式之間的區別很微妙但很重要。第一次重新綁定L
指向一個新列表,第二個保留該列表,但僅替換列表本身中包含的元素。
如果你知道你正在檢查的元素...
index_to_check = 3
if my_list[index_to_check] == bad_value:
del my_list[index_to_check]
L [:]將修改同一個列表。
這將檢查項目是否包含1在第0個索引處,如果True
使用nan
否則使用該項目原樣。
nan = float('nan')
L[:] = [nan if item[0] == 1 else item for item in L]
也許你正在試圖做這樣的事情的:
此檢查,如果該項目包含1個在任何位置不只是零,如果真用別的楠使用該項目,因爲它是。
L[:] = [nan if 1 in item else item for item in L]
如果你特別想刪除它,我會建議一個過濾器:
filter(1, L)
如果你想做些別的事情與它列表理解將是最好的辦法,但我不確定我是否應該遵循你的標題或你的榜樣。
只要你在一個特定的值上進行篩選,而不是對lambda函數的評估,它應該比列表理解更有效。
如果你正在尋找一些更復雜的事情,那麼列表理解將是最好的方法,因爲lambda函數對這些應用程序不利。
replacement = float('nan')
condition = 1
L = [replacement if item == condition else item for item in L]
L = [replacement if item[index] == condition else item for item in L]
你可以融合多種解決方案,並通過改變上述例子中的一個,以這樣的使用lambda功能,爲您的條件:
replacement = float('nan')
condition = lambda x: x[0]==1
L = [replacement if condition(item) else item for item in L]
如果你很喜歡拉姆達功能,您甚至可以包住在lambda函數
custom_filter = lambda x: [float('nan') if item[0]==1 else item for item in x]
L = custom_filter(L)
這些解決方案是由性能粗糙爲了整個事情,但它確實取決於你的具體應用和究竟你問題是。如果你想在很多不同的列表上使用它,即使custom_filter
對象具有額外的函數調用開銷,可讀性也會增加,如果連續多次使用它,性能差異將自動消失lambda函數會被緩存。
過濾器會尖叫得很快,但實際上沒有其他方法那麼靈活,第二種方法非常接近您的原始含義,但第三個例子可能是最模塊化的,並且老實說我可能是解決方案只是因爲它導致可讀和通用的代碼。