如何替换字典中所有键的第一个字符?

2024-09-28 13:16:53 发布

您现在位置:Python中文网/ 问答频道 /正文

替换字典中所有键的第一个字符的最佳方法是什么

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:])

3条回答

有很多方法可以通过列表理解或for-循环来实现这一点。重要的是要理解词典是可变的。这基本上意味着您可以修改现有词典或创建新词典

如果您想创建一个新的解决方案(我会推荐它!-请参见下面的“警告之词”),答案by @Ethem_Turgutby @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)}')

对后一种方法有一个警告:

您应该知道,在循环键时正在修改键。在大多数情况下,这是有问题的,如果直接在old_dict上循环,甚至会导致RuntimeError。我通过显式地将键解压到一个列表中,并使用[*old_dict.keys()]在该列表上循环,避免了这种情况

为什么在循环键的同时修改键会有问题?例如,假设在old_dict中有键'~key1''key1'。现在,当您的循环处理'~key1'时,它将把它修改为'key1',它已经存在于old_dict中,因此它将用'~key1'中的值覆盖'key1'的值

因此,只有在确定不会产生像前面提到的示例那样的问题时,才使用后一种方法。如果您不确定,只需创建一个新字典

这是一本词典:

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'}
old_cols = {"~desc1":"adjustment1", "~desc23":"adjustment3"}
new_cols = {}

for k, v in old_cols.items():
    new_key = k[1:] 
    new_cols[new_key] = v

相关问题 更多 >

    热门问题