2012-08-11 165 views
3

在列表字典中,刪除每個列表的最後一個元素的方法是什麼?刪除python中的列表字典中的最後一個元素

例如,藉此:

listDict = {'tom': [-2,10,2,-8], 'sam': [-9,-10,-10,-7]} 

並把它變成這樣:

listDict = {'tom': [-2,10,2], 'sam': [-9,-10,-10]} 

這是目前我在做什麼:

new = {} 
for t,item in listDict.iteritems(): 
    new[t] = [item[0], item[1], item[2]] 
listDict= new 

回答

6

Blender的答案成長,如名單增加的長度非常低效的,相比​​於該解決方案:

for k, v in listDict.items(): 
    v.pop() 

例如listDict,差異不大,只有27%。但是,使用帶有100個鍵和長度從50到100的列表的詞典,並彈出其中的50個詞典,詞典理解方法花費的時間會延長12倍以上。這是因爲此解決方案修改了存在列表,而不是每次創建每個列表的副本。

恐怕沒有這樣的單線版本,除非你是cheating。我之所以提到這一點,是爲了防止一些dofus感到被迫在評論中指出。 不要使用dict/list解析副作用。

當然,你可以做一個行,如下所示,但PEP8說,「而不是」:

for k, v in listDict.items(): v.pop() 
+0

+1個很好的答案和其他備選答案的回顧,以及與風格指南的良好鏈接。 – Zach 2012-08-11 06:21:10

7

我會用一個詞典理解:

new_dict = {key: value[:-1] for key, value in listDict.items()} 

對於老版本的Python,你必須使用dict()構造:

new_dict = dict((key, value[:-1]) for key, value in listDict.items()) 
+2

+1,偉大的答案。有一件事:'{} .iteritems()'很快就會消失,{} .items()'在Py 2.X和Py 3.X中很好用。考慮使用它來代替。 – dawg 2012-08-11 05:22:33

+0

@drewk:謝謝,我已經編輯它。 – Blender 2012-08-11 05:28:47

+0

@drewk +1給你。不知道它會消失。 – User007 2012-08-11 05:40:06

2

如果你在的地方修改要那麼這個替代不需要創建一個新的字典,或任何其他重新分配。

listDict = {'tom': [-2,10,2,-8], 'sam': [-9,-10,-10,-7]} 
for i in listDict.values(): 
    i.pop() 

並且它不需要創建新列表。記住列表是可變的。

如果您確實需要新的字典和列表,那麼以前的回覆會更好。

1

只是爲了保持比分:

def f1(): 
    listDict = {'tom': [-2,10,2,-8], 'sam': [-9,-10,-10,-7]} 
    return {key: value[:-1] for key, value in listDict.items()} 

def f2(): 
    listDict = {'tom': [-2,10,2,-8], 'sam': [-9,-10,-10,-7]} 
    for k, v in listDict.items(): 
     v.pop()  

    return listDict  


cmpthese.cmpthese([f1,f2])  

打印:

rate/sec f1  f2 
f1 571,487 -- -23.5% 
f2 746,966 30.7%  -- 
+0

感謝您的客觀比較 – Zach 2012-08-11 06:24:06

相關問題