在python中重建dict列表但结果不按顺序

时间:2016-08-01 04:10:41

标签: python list dictionary

list_1 = [{'1': 'name_1', '2': 'name_2', '3': 'name_3',}, 
       {'1': 'age_1', '2': 'age_2' ,'3': 'age_3',}]

我想操作此列表,以便dicts包含特定ID的所有属性。 ID本身必须构成最终字典的一部分。示例输出如下所示:

list_2 = [{'id' : '1', 'name' : 'name_1', 'age': 'age_1'},
       {'id' : '2', 'name' : 'name_2', 'age': 'age_2'},
       {'id' : '3', 'name' : 'name_3', 'age': 'age_3'}]

然后我做了以下事情:

>>> list_2=[{'id':x,'name':list_1[0][x],'age':list_1[1][x]} for x in list_1[0].keys()]

然后它给出了:

>>> list_2
    [{'age': 'age_1', 'id': '1', 'name': 'name_1'}, 
     {'age': 'age_3', 'id': '3', 'name': 'name_3'}, 
     {'age': 'age_2', 'id': '2', 'name': 'name_2'}]

但我不明白为什么' id'正在显示第二个位置,而#39; age'首先显示?

我尝试了其他方法,但结果是一样的。任何人都可以帮忙解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

要保留订单,您应该使用ordered dictionary。使用您的样本:

new_list = [OrderedDict([('id', x), ('name', list_1[0][x]), ('age', list_1[1][x])]) for x in list_1[0].keys()]

打印有序列表......

for d in new_list:                                                                                            
    print(d[name], d[age])
  

name_1 age_1

     

name_3 age_3

     

name_2 age_2

答案 1 :(得分:0)

尝试使用OrderedDict:

list_1 = [collections.OrderedDict([('1','name_1'), ('2', 'name_2'), ('3', 'name_3')]),
        collections.OrderedDict([('1','age_1'),('2','age_2'),('3', 'age_3')])]

list_2=[collections.OrderedDict([('id',x), ('name',list_1[0][x]), ('age', list_1[1][x])]) 
        for x in list_1[0].keys()]

这更有可能保留您想要的订单。我还是Python新手,所以这可能不是超级Pythonic,但我认为它会起作用。

输出 -

In [24]: list( list_2[0].keys() )
Out[24]: ['id', 'name', 'age']

文档: https://docs.python.org/3/library/collections.html#collections.OrderedDict

实施例: https://pymotw.com/2/collections/ordereddict.html

让构造者正确: Right way to initialize an OrderedDict using its constructor such that it retains order of initial data?