python强制一个特定的键始终位于字典

时间:2016-01-19 15:13:46

标签: python dictionary

如何强制特定键始终位于字典的开头。 例如。如果我有这样的词典列表:

source = [{'age':39, 'name':'Homer','gender':'male', 'IQ':0}, {'age':10, 'gender':'male', 'IQ':0,'name':'Bart'}]

需要' name'永远是dict的第一把钥匙:

source = [{'name':'Homer','age':39, 'gender':'male', 'IQ':0}, {'name':'Bart','age':10, 'gender':'male','IQ':0}]

我曾尝试使用运算符,但是按字母顺序排序名称的值,这不是我想要的。

from operator import itemgetter
newlist = source.sort(key=operator.itemgetter('name'))

1 个答案:

答案 0 :(得分:5)

我会尝试OrderedDict,如下所示,我只使用counter变量作为defaultdict的键,将值存储为ordereddict,而这个ordereddict是一个有序字典作为顾名思义,您可以将此ordereddict用作常规字典 - 请参阅我使用属性访问,即按name打印item[1]['name']密钥的值。最后sort_order是一个字典,它将键的顺序存储为您可以根据需要修改它的值。

from collections import OrderedDict,defaultdict
data = defaultdict(OrderedDict)
source = [{'age':39, 'name':'Homer','gender':'male', 'IQ':0}, {'age':10, 'gender':'male', 'IQ':0,'name':'Bart'}]
counter = 0
sort_order = {'IQ': 1, 'gender': 2, 'age': 3, 'name': 0}
for i in source:
    odrded_keys = sorted(i,key=lambda x: sort_order[x])
    tmp = OrderedDict(sorted(i.items(),key=lambda x: sort_order[x[0]]))
    data[counter].update(tmp)
    counter+=1
for item in  data.items():
    print item[1]
    print item[1]['name']

打印输出 -

OrderedDict([('name', 'Homer'), ('IQ', 0), ('gender', 'male'), ('age', 39)])
Homer
OrderedDict([('name', 'Bart'), ('IQ', 0), ('gender', 'male'), ('age', 10)])
Bart

修改

正如评论中所讨论的那样(OP不知道密钥的长度,但其中有一个密钥name并且它需要是第一个)我修改了代码如下 -

from collections import OrderedDict,defaultdict
data = defaultdict(OrderedDict)
source = [{'age':39, 'name':'Homer','gender':'male', 'IQ':0}, {'age':10, 'gender':'male', 'IQ':0,'name':'Bart'}]
counter = 0
for i in source:
    #get keys dynamically and remove 'name' form it and insert at first
    keys = i.keys()
    keys.remove('name')
    keys.insert(0,'name')
    #sort the dictionary by list element index- i.e. position
    tmp = OrderedDict(sorted(i.items(),key=lambda x: keys.index(x[0])))
    data[counter].update(tmp)
    counter+=1
for item in  data.items():
    print item[1]
    print item[1]['name']

输出 -

OrderedDict([('name', 'Homer'), ('IQ', 0), ('gender', 'male'), ('age', 39)])
Homer
OrderedDict([('name', 'Bart'), ('IQ', 0), ('gender', 'male'), ('age', 10)])
Bart