迭代两个词典并创建一个键不匹配的新词典

时间:2015-11-30 05:29:54

标签: python list python-3.x dictionary

我想合并以下两个词典的内容

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

有人可以解释为什么这些价值观会重演,我无法理解这一点。

2 个答案:

答案 0 :(得分: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而不是正常的dict。

答案 1 :(得分: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来解决 e.g。

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)