晚上好,
我有以下代码“原地”修改字典值
jdk-11.0.1
我的问题是,列表理解是否可以实现类似的目标?我希望所有值都在同一列表中。
预先感谢
答案 0 :(得分:1)
List comps不能解决所有问题,您需要进行查找以减少将5遍迭代到1遍的所有item():
def mapper(v):
if 300 < v < 900: # syntactical equivalent to v > 300 and v < 900
return 0
if 1400 < v < 2100:
return 1
if 8700 < v < 9100:
return 2
if 3800 < v < 4100:
return 3
if 6400 < v < 7000:
return 4
return v
translate1 = {k:mapper(v) for k, v in translate1.items()}
您缺少一些价值观-我希望这是故意的。
答案 1 :(得分:1)
我会这样写你的函数:
def mapper(v):
di={
(300,900): 0,
(1400,2100): 1,
(8700,9100): 2,
(3800,4100): 3,
(6400,7000): 4
}
for (t0,t1),ret in di.items():
if t0<v<t1: return ret
return v
translate1={k:mapper(v) for k,v in translate1.items()}
除了mapper
函数的形式作为元组的决定之外,这与Patrick Artner的回答没有实质区别。
其他评论:
di={k:f(v) for k,v in di.items()}
表单在di
上不进行就地更新。相反,对dict的理解是首先创建一个新的匿名dict,然后在完成后将该dict分配给名称di
。主要的问题(也许)是,这样做的内存需求至少比就地分配要多2倍。 li[:]=[list comprehension]
或.update
与字典理解di.update({dict comprehension on a subset of di})
一起使用