2016-04-29 79 views
-1

我有這樣的代碼:從字典蟒蛇的列表中刪除所有出現

>>> my_list = [ 
...  {'key1': 1, 'key2': 1., 'key3': 'a'}, 
...  {'key1': 0, 'key2': 0., 'key3': 'b'} 
... ] 
>>> 

我需要刪除某個鍵的所有事件(即「鍵2」)從my_list:

>>> my_list = [ 
...  {'key1': 1, 'key3': 'a'}, 
...  {'key1': 0, 'key3': 'b'} 
... ] 
>>> 

是什麼最pythonic和更快的模式來做到這一點?

附加說明:'my_list'實際上是一個包含更多行的列表,每個字典都有幾十個鍵。

+3

這兩個''my_list''有什麼區別?我看不到。那麼期望的結果是什麼? – zegkljan

+1

謝謝zegkljan固定在描述中。 – gonzasanchez

回答

6
for my_dict in my_list: 
    my_dict.pop('key2', None) 

您還可以del刪除鍵,但除非你確信它是存在於每一個字典,你需要明確檢查開關是否存在與否:

for my_dict in my_list: 
    if 'key2' in my_dict: 
     del my_dict['key2'] 

或:

for my_dict in my_list: 
    try: 
     del my_dict['key2'] 
    except KeyError: 
     pass 

這代碼最後一塊的「Python化」原則,即「它更容易請求原諒比許可」,這意味着在一個偏愛應該處理異常的例子提前做好工作,防止它們發生。但是,這不是一個很好的原理示例,因爲在這種情況下,它更多的代碼沒有明顯的益處。

+0

@Francesco:是的,我剛剛在評論你的工作。正如我已經解釋的那樣,它具有說明一般pythonic原理的優點,但我認爲這個原理對於這個特殊情況不是很有說服力。 –

+0

好的,謝謝,但是如果我想刪除一個鍵列表,例如:'keys_to_remove = ['key2','key5']' 這是最Python的方法嗎? (不使用兩個for-loop)。 謝謝! – gonzasanchez

+0

@gsanchez:我不想太過於擔心「pythonic」的定義,但在我看來,編寫該文件的最好方法是使用兩個循環。如果不是修改現有的數據結構,而是創建新的數據結構,例如jDo的答案,那麼其他方法可能會更好。 –

2

與大多數列表和字典和Python,.pop()是從數據對象中除去的物品的最佳方式。

從每個詞典中刪除特定鍵,在字典中的列表,並附有for循環迭代,並使用.pop()(你想刪除鍵和None爲返回的參數)刪除鍵。

for dictionary in list_of_dictionaries: 
    dictionary.pop(key_you_want_to_pop, None) 

欲瞭解更多信息,請參閱this

祝你好運,快樂的編碼!

0

如果你喜歡一個oneliner可以使用map

map(lambda d: d.pop('key2', None), my_list) 
+0

有關py2/3差異的註釋:在3中,這將不會執行任何操作,直到地圖消耗完畢。 –

1

有幾種方法可以做到這一點。例如。使用列表理解:

my_list = [{'key3': 'a', 'key2': 1.0, 'key1': 1}, {'key3': 'b', 'key2': 0.0, 'key1': 0}] 

my_new_list = [{y[0]:y[1] for y in x.items() if y[0] != "key2"} for x in my_list] 

要刪除使用這種方法快捷鍵的列表(創建一個新的列表):

my_new_list = [{y[0]:y[1] for y in x.items() if y[0] not in ["key2", "key3"]} for x in my_list] 

注:的OP接受了這個答案;很可能是因爲在編寫本文時,它是唯一一個可以從列表中刪除多個鍵的人。但是,此解決方案創建新詞典並將其添加到新列表中;它不會修改原始列表。這是一切都很好,如果你想保留原來的列表,但它肯定比在地方修改列表慢。我的筆記本電腦有些粗糙timeit試驗表明,pop平在for環爲3 - 比這個答案的解決方案快3.5倍。

總是選擇適合這項工作的工具。