修改Python字典的键

3

有没有一种简单而优美的方法可以就地修改Python字典中的所有键?

for key in my_dict.keys():
    my_dict[my_modification(key)] = my_dict.pop(key)

只要my_modification(key)不与my_dict中的原始键相同,这个方法就可以正常运行。否则,我会遇到问题。在我的问题中,所有的键都是整数-100 < key < 100,修改只是全局移位,使最小的键变为零。

需要原地修改吗?为什么不使用new_dict = {my_modification(key): val for key, val in my_dict.items()}这样的方法呢? - jonrsharpe
不是很好,那样做可以行得通。但我想知道是否有更好的方法。 - Christian
“Better”怎么定义为更好? - jonrsharpe
我只是觉得,如果我有一个有大量键的字典,那么创建这些键的第二个副本比逐个修改每个键更费力。 - Christian
3个回答

7

只需创建一个新的字典:

new_dict = {my_mod(key): my_dict[key] for key in my_dict}

添加my_dict.clear()my_dict.update(new_dict),你就得到了OP所要求的内容。 - Robᵩ
1
我可以使用“my_dict = {my_mod(key) : my_dict[key] for key in my_dict}”来完成,但我认为可能有更好的方法。 - Christian

1
我会支持构建一个新的字典,就像其他答案所建议的那样,但是如果您在替换原始字典之前提取所有键并以相反的顺序排序,则可以在原地解决它。
换句话说,如果确保旧键和新键不相互混合,那么可以通过在替换之前对键进行反向排序来实现原地替换,这在您的情况下可以处理。
免责声明:不确定以这种方式做任何事情是否会有所收获,但是如果您想要这样做,它是可行的。

1
尝试直接修改字典的键总是存在覆盖某些键的危险,正如您所指出的那样。相反,创建一个新的字典会更加容易:
my_modified_dict = \
{my_modification(key) : value for (key, value) in my_dict.iteritems()}

好的,那就只有这样做了,没有捷径... 无论如何还是谢谢! - Christian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接