【问题标题】:Apply function on all values of dictionary [duplicate]对字典的所有值应用函数[重复]
【发布时间】:2015-02-15 13:18:09
【问题描述】:

我的字典看起来像

d= {(1, 8): 94.825000000000003, (2, 8): 4.333}

我正在尝试应用一个函数来舍入所有值。

我不想重新创建字典。

newD= {}
for x,y in d.iteritems():
   newD+= {x:round(y)}

是否有任何 pythonic 方式将round 函数应用于所有值?

【问题讨论】:

  • 您的示例实际上不起作用,而且如果我错了,您似乎正在通过 newD 纠正我来重新创建字典
  • 不是重复的。这是不同的

标签: python dictionary


【解决方案1】:

这有点令人费解,但您确实要求使用“pythonic-way”;)

newD = {k:round(v) for k, v in d.items()}

但是,此字典理解仅适用于 2.7+。如果使用旧版本的 Python,请尝试这种更复杂的方式:

newD = dict(zip(d.keys(), [round(v) for v in d.values()]))

让我稍微解开一下:

  • 我们首先根据请求将新字典 (d) 对象重新分配回新字典(尽管您可以轻松地将其分配给相同的名称)
  • 外部dict() 确保最终结果是字典对象
  • zip() 返回一个元组列表,其中第 i 个元组包含每个参数序列中的第 i 个元素
  • zip() 的第一个参数序列是字典键 (d.keys())
  • zip() 的第二个参数序列是列表解析后的舍入值
  • 列表推导对字典值中的每个值进行四舍五入并返回四舍五入值的列表

【讨论】:

  • 或者你可以写d = {k:round(v) for k, v in d.items()},但问题明确指出“我不想重新创建字典。”
  • @Bogdan 好点,已更新。谢谢!
  • 优雅的解决方案@Dan
  • 很抱歉,这根本不是一个优雅的解决方案,而且绝对不是 pythonic。 en.wikipedia.org/wiki/Obfuscation_%28software%29 第二个代码虽然很好
【解决方案2】:

你可以试试这样的:

for k, v in d.iteritems():
    d[k] = round(v)

它将对字典中的所有项目进行就地舍入。在这个特定的示例中,它将完美地工作,但要小心 - 使用 the round function 的所有正常警告都适用。

【讨论】:

  • 你正在四舍五入字典键元组成员之一,这怎么可能是答案?
  • @jamylak 对不起,我不明白你的问题?我遍历字典中的每个键、值对,计算一个新值并替换字典中的旧值。
  • 不,你不是,你只是在迭代键。在你的循环中尝试print k, v
  • @jamylak - 呸!你说得对,我没有添加 .iteritems()。立即编辑回复
  • 你的答案现在没有错,但我不知道这是否是OP想要的,问题很不清楚
猜你喜欢
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多