2013-06-25 63 views
0

我正在尋找從列表中刪除多個索引,並希望按內容對它們進行過濾。例如:從列表中刪除索引,如果它包含特定的值

L= [(1, 2, 3), (etc, etc, etc), (......)] 
if L[i] == 1: 
    L[i] == nan 
>>>L 
[(nan), (etc, etc.......] 

我知道這個代碼是不正確的,但它只是一個例子,幫助遍歷了我想做的事,任何幫助表示讚賞,感謝。

回答

2

您使用列表理解:

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指向一個新列表,第二個保留該列表,但僅替換列表本身中包含的元素。

1

如果你知道你正在檢查的元素...

index_to_check = 3 
if my_list[index_to_check] == bad_value: 
    del my_list[index_to_check] 
2

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] 
1

如果你特別想刪除它,我會建議一個過濾器:

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函數會被緩存。

過濾器會尖叫得很快,但實際上沒有其他方法那麼靈活,第二種方法非常接近您的原始含義,但第三個例子可能是最模塊化的,並且老實說我可能是解決方案只是因爲它導致可讀和通用的代碼。

相關問題