0

编辑为包含正确的虚拟代码。-由帝斯曼解决-

这个问题似乎很简单(在我的脑海中),我试图找到一种方法来“更新”一个基于另一个字典 k,v 对的字典值。

虚拟文本:

>>> dict1 = {'hello':'HELLO', 'bye':'BYE', 'right':'RIGHT', 'left':'LEFT'}
>>> dict2 = {'why':['hello', 'bye'], 'direction': ['left', 'right', 'right', 'right']}

结果我想要: - 只需更新dict2以包含dict1' 键的值(如果存在)。

updated_dict = {'why':['HELLO', 'BYE'], 'direction':['LEFT', 'RIGHT', 'RIGHT', 'RIGHT']}

我正在尝试这样做:

updated_dict = dict()
for v in dict2.values():
    id_list = dict2[v]
    for uniq_id in id_list: 
        new_id = dict1[uniq_id]
        if updated_dict.has_key(uniq_id):
            updated_dict[v].append(uniq_id)
        else:
            updated_dict[v] = list()
            updated_dict[v].append(uniq_id)

由于不可散列列表,这将不起作用。这难倒我,我想不出解决这个问题的方法,有什么想法吗?

注意不是一个简单的小写 -> 大写问题,这只是为了捕捉我的问题本质而创建的虚拟文本。

4

2 回答 2

4

疯狂的猜测:你在想这样的事情吗?

>>> dict1 = {'hello':'HELLO', 'bye':'BYE', 'right':'RIGHT', 'left':'LEFT'}
>>> dict2 = {'why': ['hello', 'bye'], 
    'direction': ['left', 'right', 'right', 'right'],
    'example': ["don't replace me", "right"]}
>>> new_d = {k: [dict1.get(x,x) for x in v] for k,v in dict2.items()}
>>> new_d
{'direction': ['LEFT', 'RIGHT', 'RIGHT', 'RIGHT'], 
'why': ['HELLO', 'BYE'], 
'example': ["don't replace me", 'RIGHT']}

我使用了get接受默认值的字典方法,以允许您没有替换的值不变地通过。

于 2013-04-22T22:56:35.993 回答
3

可能不是最简单的,但适用于您的示例:

>>> m={ x:",".join([dict1[y] for y in dict2[x].split(", ")]) for x in dict2}

或者

>>> m={ k:",".join([dict1[y] for y in v.split(", ")]) for k,v in dict2.items()} 

结果是一样的:

>>> m
>>> {'direction': 'LEFT,RIGHT,RIGHT,RIGHT', 'why': 'HELLO,BYE'}
于 2013-04-22T23:01:31.940 回答