Python 如何替换字典所有键中的子字符串

Python 如何替换字典所有键中的子字符串,python,Python,我想更改字典中键的名称。我理解这是不可能的,并且为此目的 我必须用旧值创建新键,并删除原始键(我不太喜欢),或者 在` for循环中创建字典的副本,并在每次迭代中更改键的名称 当前格言: {'form-4-var0':125547'form-4-var1':'NTMC-A935','form-4-var2':'OTOGL'} 期望的格言: {'var0':125547'var1':'NTMC-A935','var2':'OTOGL'} 约束:如有可能,保留顺序(非强制性) 我所尝试的: 我尝试了

我想更改字典中键的名称。我理解这是不可能的,并且为此目的 我必须用旧值创建新键,并删除原始键(我不太喜欢),或者 在` for循环中创建字典的副本,并在每次迭代中更改键的名称

当前格言:

{'form-4-var0':125547'form-4-var1':'NTMC-A935','form-4-var2':'OTOGL'}

期望的格言:

{'var0':125547'var1':'NTMC-A935','var2':'OTOGL'}

约束:如有可能,保留顺序(非强制性)

我所尝试的:

我尝试了类似的方法,在每个键名中添加了一些虚拟文本,效果很好

d1 = {'form-4-var0': 125547, 'form-4-var1': 'NTMC-A935', 'form-4-var2': 'OTOGL'}
d2 = {}
for key in d1:
    key_modified = //key without 'form-n-' substring
    d2[key_modified] = d1[key]
但是如何删除子字符串
form-n-

一般来说,n只是一个数字,但它可以是2、3或m个数字。我应该用一些正则表达式吗


有没有一种更像python的方法可以做到这一点?

你可以使用dict comprehension来做到这一点。要删除额外的文本,可以使用
.replace()

另一个选择是使用split,但我不推荐这么多,因为信息可能在
form-4-

old = {'form-4-var0': 125547, 'form-4-var1': 'NTMC-A935', 'form-4-var2': 'OTOGL'}
new = {k.split('form-4-')[1]:v for k,v in old.items()}
输出

{'var0': 125547, 'var1': 'NTMC-A935', 'var2': 'OTOGL'}

如果密钥格式相同,则可以使用
-
将其拆分,并使用拆分的最后一项

试着像这样理解口述:

d = {'form-4-var0': 125547, 'form-4-var1': 'NTMC-A935', 'form-4-var2': 'OTOGL'}

d1 = {key.split('-')[-1]:value for key, value in d.items()}
print(d1)
输出为:

{'var0': 125547, 'var1': 'NTMC-A935', 'var2': 'OTOGL'}

我在下面编写的代码创建了一个全新的字典,其中包含您想要的结果:保留旧值,但更改与它们相关联的名称,并且仍然保持旧的顺序。此外,这本旧字典仍然保留着

第一个
for
循环遍历字典的每个名称,并将它们切片两次。一次删除第一个连字符(或分隔符),两次删除第二个连字符(或分隔符)。这也意味着字典名称可以是您想要的长度,但始终用连字符分隔

最后一个
for
循环接受新的名称列表,并用它们和旧值构建一个新字典

old_dict = {'form-4-var0': 125547,
        'form-4-var1': 'NTMC-A935',
        'form-4-var2': 'OTOGL'}
old_dict_names = list(old_dict.keys())#get the names

new_dict = {}
new_dict_names = []


for i in old_dict_names:
    #First slicing, losing the first hyphen
    hyphen_1_pos = i.index("-")
    slice_1 = i[hyphen_1_pos+1:]
    print(f"First slice of {i} = {slice_1}")

    #Second slicing, losing all of the hyphens leaving the desired names
    hyphen_2_pos = slice_1.index("-")
    slice_2 = slice_1[hyphen_2_pos+1:]
    print(F"Final slice of {slice_1} = {slice_2}\n")

    new_dict_names.append(slice_2)#Adding the final result to a list

print(f"New wanted names for dictionary {new_dict_names}")

for nameIndex in range(0, len(old_dict_names)):
    new_name = new_dict_names[nameIndex]
    old_value = old_dict.get(old_dict_names[nameIndex])
    print(f"Old wanted value {nameIndex} for dictionary: {old_value}")

    new_dict[new_name] = old_value

print(f"\n\nNew dictionary as requested: {new_dict}")
print(f"old dictionary {old_dict}")

希望这对你或其他人有帮助

清洁溶液,谢谢!如果我没有错的话,如果子字符串总是“form-4-…”,那么这个解决方案是有效的,但是正如我所说的,子字符串可以有m个数字。可以是表格1、表格2、表格33、表格495。。
old_dict = {'form-4-var0': 125547,
        'form-4-var1': 'NTMC-A935',
        'form-4-var2': 'OTOGL'}
old_dict_names = list(old_dict.keys())#get the names

new_dict = {}
new_dict_names = []


for i in old_dict_names:
    #First slicing, losing the first hyphen
    hyphen_1_pos = i.index("-")
    slice_1 = i[hyphen_1_pos+1:]
    print(f"First slice of {i} = {slice_1}")

    #Second slicing, losing all of the hyphens leaving the desired names
    hyphen_2_pos = slice_1.index("-")
    slice_2 = slice_1[hyphen_2_pos+1:]
    print(F"Final slice of {slice_1} = {slice_2}\n")

    new_dict_names.append(slice_2)#Adding the final result to a list

print(f"New wanted names for dictionary {new_dict_names}")

for nameIndex in range(0, len(old_dict_names)):
    new_name = new_dict_names[nameIndex]
    old_value = old_dict.get(old_dict_names[nameIndex])
    print(f"Old wanted value {nameIndex} for dictionary: {old_value}")

    new_dict[new_name] = old_value

print(f"\n\nNew dictionary as requested: {new_dict}")
print(f"old dictionary {old_dict}")