替换字典中所有键的第一个字符的最佳方法是什么?
old_cols= {"~desc1":"adjustment1","~desc23":"adjustment3"}
我正在努力获得
new_cols= {"desc1":"adjustment1","desc23":"adjustment3"}
我试过了:
for k,v in old_cols.items():
new_cols[k]=old_cols.pop(k[1:])
答案 0 :(得分:2)
old_cols = {"~desc1":"adjustment1", "~desc23":"adjustment3"}
new_cols = {}
for k, v in old_cols.items():
new_key = k[1:]
new_cols[new_key] = v
答案 1 :(得分:1)
这里是字典理解:
old_cols= {"~desc1":"adjustment1","~desc23":"adjustment3"}
new_cols = {k.replace('~', ''):old_cols[k] for k in old_cols}
print(new_cols)
#{'desc1': 'adjustment1', 'desc23': 'adjustment3'}
答案 2 :(得分:1)
有很多方法可以使用列表推导式或 for
循环来做到这一点。重要的是要了解字典是可变的。这基本上意味着您可以修改现有字典或创建一个新字典。
如果您想创建一个新的解决方案(我会推荐它! - 请参阅下面的'警告...'),答案中提供了两种解决方案by @Ethem_Turgut和 by @pakpe 解决问题。我可能会写:
old_dict = {"~desc1":"adjustment1","~desc23":"adjustment3"}
# get the id of this dict, just for comparison later.
old_id = id(old_dict)
new_dict = {k[1:]: v for k, v in old_dict.items()}
print(f'Is the result still the same dictionary? Answer: {old_id == id(new_dict)}')
现在,如果您想就地修改字典,您可以遍历键并根据自己的喜好调整键/值:
old_dict = {"~desc1":"adjustment1","~desc23":"adjustment3"}
# get the id of this dict, just for comparison later.
old_id = id(old_dict)
for k in [*old_dict.keys()]: # note the weird syntax here
old_dict[k[1:]] = old_dict.pop(k)
print(f'Is the result still the same dictionary? Answer: {old_id == id(old_dict)}')
您应该意识到您在循环时修改键。这在大多数情况下都是有问题的,如果直接在 RuntimeError
上循环,甚至可能导致 old_dict
。我通过将键显式地解包到列表中并使用 [*old_dict.keys()]
循环遍历该列表来避免这种情况。
为什么在循环时修改键会出现问题?例如,假设您的 '~key1'
中有键 'key1'
和 old_dict
。现在,当您的循环处理 '~key1'
时,它会将其修改为 'key1'
中已经存在的 old_dict
,因此它将用 {{1} 中的值覆盖 'key1'
的值}.
因此,只有在您确定不会产生与前面提到的示例类似的问题时才使用后一种方法。如果您不确定,只需创建一个新字典即可!