在列表字典中删除每个列表的最后一个元素有什么更加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
答案 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]}