迭代两个字典并创建一个新的字典,其中键不匹配

3
我想合并下面这两个字典的内容。
>>> key_dict 
{    
     '1': 'seq', 
     '0': 'seq',
     '2': 'seq'
}
>>> value_dict
{    
     'tedious; repetitive and boring': 'text',
     'worldly': 'text', 
     'ordinary': 'text'
}

因此,在最终列表中,我有类似以下内容的东西

>>>final_list 
[
    {
        'seq': 0,
        'text': 'worldly'
    }, 
    {
        'seq': 1, 
        'text': 'tedious; repetitive and boring'
    },
    {
        'seq': 2, 
        'text': 'ordinary'
    }
]

编辑:抱歉,我尝试了这个

>>> final_list = []
>>> temp_dict = {}
>>> for (key1, value1), (key2, value2) in zip(key_dict.items(), value_dict.items()):
...   temp_dict[value1] = key1
...   temp_dict[value2] = key2
...   final_list.append[temp_dict]
... 
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
TypeError: 'builtin_function_or_method' object is not subscriptable
>>> 

请问我哪里出了问题,需要帮助。

编辑2:

更正后,将final_list.append[temp_dict]改为final_list.append(temp_dict)

我得到了这个结果

>>> pprint(final_list)
[{'seq': '1', 'text': 'ordinary'},
 {'seq': '1', 'text': 'ordinary'},
 {'seq': '1', 'text': 'ordinary'}]
>>>

有人能解释一下为什么值会被重复,我无法理解。


抱歉,我编辑了问题并添加了我已经尝试过的内容。 - Tasdik Rahman
1
为了实现这一点,您的所有字典都必须是 OrderedDict - JRodDynamite
我应该将值作为元组传递给字典吗? - Tasdik Rahman
为了解决你的错误,代码 final_list.append[temp_dict] 应该修改为 final_list.append(temp_dict) - Paul Rooney
@PaulRooney 哎呀,我在问题中添加了输出。 - Tasdik Rahman
2个回答

3
你做得很好。值会重复出现是因为在每次迭代结束时你没有清空temp_dict。实际上,你根本不需要temp_dict,只需执行:
>>> for (key1, value1), (key2, value2) in zip(key_dict.items(), value_dict.items()):
...     final_list.append({value1: int(key1), value2: key2})

[{'seq': 1, 'text': 'ordinary'},
 {'seq': 0, 'text': 'tedious; repetitive and boring'},
 {'seq': 2, 'text': 'worldly'}]

如果顺序很重要,那么你应该使用 collections.OrderedDict 而不是普通的字典。

1
按照问题中指定的顺序。
from collections import  OrderedDict
from pprint import pprint

key_dict = {    
     '1': 'seq', 
     '0': 'seq',
     '2': 'seq'
}
value_dict = {    
     'tedious; repetitive and boring': 'text',
     'worldly': 'text', 
     'ordinary': 'text'
}

kds = OrderedDict(sorted(kv for kv in key_dict.items()))
vds = OrderedDict(sorted((kv for kv in value_dict.items()), reverse=True))

d = [{v1: int(k1), v2: k2} for (k1, v1), (k2, v2) in zip(kds.items(), vds.items())]

pprint(d)

输出:

[{'seq': 0, 'text': 'worldly'},
 {'seq': 1, 'text': 'tedious; repetitive and boring'},
 {'seq': 2, 'text': 'ordinary'}]

你原本的代码问题可以通过将 temp_dict 移至循环内部解决。
例如:
final_list = []
for (key1, value1), (key2, value2) in zip(key_dict.items(), value_dict.items()):
    temp_dict = {}
    temp_dict[value1] = key1
    temp_dict[value2] = key2
    final_list.append(temp_dict)

非常好的回答 :). 谢谢 - Tasdik Rahman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接