如果dict2 value = dict1 key,则用dict1值替换整个dict2值

时间:2017-02-10 16:55:53

标签: python python-2.7 dictionary replace

我有两本词典。在这两个词典中,每个键的值都是一个列表。如果字典2中任何列表中的任何元素等于字典1的键,我想用该字典1列表中的第一个元素替换该元素。

换句话说,我有:

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']

所以看起来替换方法的一切都正常。有没有办法让这项工作?用另一个值列表中的字符串替换值列表中的整个字符串?

非常感谢你的帮助。

3 个答案:

答案 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 中相应列表的第一个条目,只有我们可以在dict1dict1[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
        }
    }
}