换句话说,我有:
dict1 = {'IDa':['newA', 'x'], 'IDb':['newB', 'x']}
dict2 = {1:['IDa', 'IDb']}
我希望:
dict2 = {1:['newA', 'newB']}
我试过了:
for ID1, news in dict1.items():
for x, ID2s in dict2.items():
for ID in ID2s:
if ID == ID1:
print ID1, 'match'
ID.replace(ID, news[0])
for k, v in dict2.items():
print k, v
我得到了:
IDb match
IDa match
1 ['IDa', IDb']
所以看起来替换方法的一切都正常。有没有办法让这项工作?用另一个值列表中的字符串替换值列表中的整个字符串?
非常感谢你的帮助。
答案 0 :(得分:3)
试试这个:
dict1 = {'IDa':['newA', 'x'], 'IDb':['newB', 'x']}
dict2 = {1:['IDa', 'IDb']}
for key in dict2.keys():
dict2[key] = [dict1[x][0] if x in dict1.keys() else x for x in dict2[key]]
print dict2
这将打印:
{1: ['newA', 'newB']}
根据需要。
dict.keys()
只给出了字典的键(即结肠的左侧)。当我们使用for key in dict2.keys()
时,目前我们唯一的关键是1
。如果字典较大,则循环遍历所有键。
以下行使用list comprehension - 我们知道dict2[key]
为我们提供了一个列表(冒号的右侧),因此我们遍历列表中的每个元素(for x in dict2[key]
)并返回dict1
中相应列表的第一个条目,只有我们可以在dict1
(dict1[x][0] if x in dict1.keys
)的键中找到该元素,否则请离开元素未触及([else x]
)。
例如,如果我们将字典更改为以下内容:
dict1 = {'IDa':['newA', 'x'], 'IDb':['newB', 'x']}
dict2 = {1:['IDa', 'IDb'], 2:{'IDb', 'IDc'}}
我们得到了输出:
{1: ['newA', 'newB'], 2: ['newB', 'IDc']}
因为'IDc'
的密钥中不存在dict1
。
答案 1 :(得分:1)
您也可以使用字典理解,但我不确定它们是否在Python 2.7中工作,它可能仅限于Python 3:
# Python 3
dict2 = {k: [dict1.get(e, [e])[0] for e in v] for k,v in dict2.items()}
编辑:我刚检查过,这在Python 2.7中有效。但是,dict2.items()应替换为dict2.iteritems():
# Python 2.7
dict2 = {k: [dict1.get(e, [e])[0] for e in v] for k,v in dict2.iteritems()}
答案 2 :(得分:0)
这是一个有趣的!
new_dict = {1: []}
for val in dict2[1]:
if val in dict1:
new_dict[1].append(dict1[val][0])
else:
new_dict[1].append(val)
dict2 = new_dict
或者,这是没有列表理解的相同逻辑:
if let options = snapshotValue["options"] as? [Any] {
for option in options {
if let optionDict = option as? [String:Any] {
let votes = optionDict["votes"] as? Int
let url = optionDict["uri"] as? String
}
}
}