我有一个嵌套字典,我想替换一个特定的键。当我尝试使用替换替换密钥时,我收到错误。
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命令还是有更好的方法吗?
答案 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)