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

Zac*_*ach 3 python dictionary

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

例如,拿这个:

listDict = {'tom': [-2,10,2,-8], 'sam': [-9,-10,-10,-7]}
Run Code Online (Sandbox Code Playgroud)

并将其转化为:

listDict = {'tom': [-2,10,2], 'sam': [-9,-10,-10]}
Run Code Online (Sandbox Code Playgroud)

这就是我目前正在做的事情:

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

Ble*_*der 7

我会用词典理解:

new_dict = {key: value[:-1] for key, value in listDict.items()}
Run Code Online (Sandbox Code Playgroud)

对于较旧的Python版本,您必须使用dict()构造函数:

new_dict = dict((key, value[:-1]) for key, value in listDict.items())
Run Code Online (Sandbox Code Playgroud)

  • +1,很棒的答案.有一件事:`{} .iteritems()`很快就会消失,而`{} .items()`在Py 2.X和Py 3.X中效果很好.考虑使用它. (2认同)

Lau*_*low 6

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

for k, v in listDict.items():
    v.pop()
Run Code Online (Sandbox Code Playgroud)

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

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

当然你可以在一行上完成如下操作,但是PEP8说"而不是":

for k, v in listDict.items(): v.pop()
Run Code Online (Sandbox Code Playgroud)