在列表字典中删除每个列表的最后一个元素有什么更加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)
我会用词典理解:
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)
与此解决方案相比,随着列表长度的增加,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)