2016-02-25 62 views
1

說我有類型的字典列表:一鍵添加到字典,如果不存在,然後重命名該鍵

ls = [{'id': 1, 'a1': 2, 'a2': 3}, {'id':2, 'a2':4}, {'id':3, 'a2':5}] 

其中a1不會在某些類型的字典存在

我想設置a1a1丟失的這些字典中爲0,並在所有字符中將密鑰名稱a1更改爲b1。這裏是我想出

for l in ls: 
    l.setdefault('a1', 0) 
    l['b1'] = l.pop('a1') 

我不知道該代碼有可能使之更有效率,因爲我需要運行這段代碼數百萬次。任何改進將不勝感激。

+0

你爲什麼不直接使用代碼:'l.setdefault ('b1',l.pop('a1')if'a1'in l else 0)' –

+0

在我的舊筆記本上,在包含一百萬字典的列表上運行代碼只需要半秒。如果你的代碼做了其他任何事情,看起來它不太可能成爲瓶頸。尋找更優雅的代碼可以很有趣,但我不會擔心這種規模的效率。 – DSM

+0

@DSM,我會在只有1cpu和0.5G RAM的VPS上運行它。每個列表將有數百個高達10k的字典,並且我有數千萬個這樣的列表要運行。說我有10米的名單,不知何故我可以節省0.01秒,這將爲我節省27.78小時。所以任何改進都可能很重要。 – Harrison

回答

6

這是一個輕微的改善,其利用了這一dict.pop()可以帶參數恢復爲默認值,如果該鍵不在字典中:

ls = [{'id': 1, 'a1': 2, 'a2': 3}, {'id':2, 'a2':4}, {'id':3, 'a2':5}] 
for d in ls: 
    d['b1'] = d.pop('a1', 0) 

>>> ls 
[{'a2': 3, 'id': 1, 'b1': 2}, {'a2': 4, 'id': 2, 'b1': 0}, {'a2': 5, 'id': 3, 'b1': 0}] 
+0

謝謝,這非常好! – Harrison

相關問題