删除python中列表字典中的最后一个元素

时间:2012-08-11 05:10:43

标签: python dictionary

在列表字典中删除每个列表的最后一个元素有什么更加pythonic或有效的方法?

例如,拿这个:

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

5 个答案:

答案 0 :(得分: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())

答案 1 :(得分:6)

与此解决方案相比,随着列表长度的增加,Blender的答案变得非常低效:

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

对于您的示例listDict,差异并不大,只有27%。但是使用带有100个密钥的dict和长度从50到100的列表,并弹出50个,dict理解方法需要的时间要长12倍。这是因为此解决方案修改了存在列表,而不是每次都创建每个列表的副本。

我担心没有单行版本,除非你是cheating。我提到这一点的原因是为了防止某些dofus感到被迫在评论中指出它。 不要使用dict / list comprehensions来表示副作用。

当然,您可以按如下方式在一行上执行此操作,但PEP8说“而不是”:

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

答案 2 :(得分:2)

如果您想进行现场修改,则此备选方案不需要创建新词典或任何其他重新分配。

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

并且不需要创建新列表。记住列表是可变的。

如果您确实需要新的词典和列表,那么之前的回复会更好。

答案 3 :(得分: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%     --

答案 4 :(得分:0)

如果您可以使用 pandas,鉴于此 dict

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

像这样删除最后一个元素:

import pandas 
df = pandas.DataFrame(data=listDict)
new = df[:-1]
print(new)

产生:

   tom  sam
0   -2   -9
1   10  -10
2    2  -10

如果您希望将其作为 dict,则:

print(new.to_dict('list'))

产生:

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