如何使用replace来替换嵌套字典中的键

时间:2018-04-22 12:55:22

标签: python dictionary

我有一个嵌套字典,我想替换一个特定的键。当我尝试使用替换替换密钥时,我收到错误。

a = {'Stefan':  [('__label__A', 0.90), ('__label__O', 0.06), ('__label__I', 0.01)],
     'William': [('__label__A', 0.73), ('__label__B', 0.12), ('__label__U', 0.06)],
     'James':   [('__label__A', 0.63), ('__label__O', 0.35), ('__label__U', 0.01)]
    }

_names = list(a.keys())
# for i in range(len(3)
tmp = a.get(_names[0])[0][0]
if tmp == '__label__W':
    tmp = 'White'
elif tmp == '__label__A':
    tmp = 'Asian'
elif tmp == '__label__B':
    tmp = 'Black'
elif tmp == '__label__I':
    tmp = 'Alaskan'
elif tmp == '__label__O':
    tmp = 'other'
elif tmp == '__label__M':
    tmp = 'Two races'
else:
    tmp = 'Undesginated'
a.replace(a.get(_names[0])[0][0],tmp)
#(a.keys()).replace('__label__A','Asian')
#(a.get(_names[0])[0][0]).replace(tmp)
#a.replace('__label__A','Asian')
print(a)

我收到错误:

AttributeError: 'dict' object has no attribute 'replace'

标签应该替换为

{'__label__W':'White', '__label__A': 'Asian', 
 '__label__B': 'Black','__label__I': 'Alaskan', 
 '__label__O': 'other','__label__M': 'Two races',
 '__label__U': 'Undesginated'}

在这种情况下如何使用replace命令还是有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

元组是不可变的,因此您无法替换或重新分配其值。但是,您可以替换周围列表中的整个元组。

为了比使用大型for循环和大量if语句更容易,我们应该定义一个替换字典,以便将来更容易修改和添加/删除条目。

replacements = {'__label__W': 'White', '__label__A': 'Asian', 
                '__label__B': 'Black', '__label__I': 'Alaskan', 
                '__label__O': 'other', '__label__M': 'Two races',
                '__label__U': 'Undesginated'}

现在我们可以使用for循环来循环遍历a字典中的键,但我个人觉得只需要理解就可以更容易地重新定义整个字典。

你可能不习惯字典理解,但它们是相当不言自明的:

{n:[(replacements[i], j) for i, j in l] for n, l in a.items()}

给出:

{'Stefan':  [('Asian', 0.9),  ('other', 0.06), ('Alaskan',      0.01)], 
 'William': [('Asian', 0.73), ('Black', 0.12), ('Undesginated', 0.06)],
 'James':   [('Asian', 0.63), ('other', 0.35), ('Undesginated', 0.01)]}

要替换一个,你必须重新定义整个元组:

a['Stefan'][0] = ('Asian', a['Stefan'][0][1])

,并提供:

{'Stefan':  [('Asian',      0.9),  ('__label__O', 0.06), ('__label__I', 0.01)],
 'William': [('__label__A', 0.73), ('__label__B', 0.12), ('__label__U', 0.06)],
 'James':   [('__label__A', 0.63), ('__label__O', 0.35), ('__label__U', 0.01)]}

答案 1 :(得分:0)

尝试使用此代替a.replace(a.get(_names[0])[0][0],tmp)

a[_names[0]][0]=(tmp, a[_names[0]][0][1])

>a[_names[0]][0]
('Asian', 0.73)