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

Mar*_*ark 2 python dictionary

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

source = [{'age':39, 'name':'Homer','gender':'male', 'IQ':0}, {'age':10, 'gender':'male', 'IQ':0,'name':'Bart'}]
Run Code Online (Sandbox Code Playgroud)

需要'name'始终是dict中的第一个键:

source = [{'name':'Homer','age':39, 'gender':'male', 'IQ':0}, {'name':'Bart','age':10, 'gender':'male','IQ':0}]
Run Code Online (Sandbox Code Playgroud)

我试图使用运算符,但是按字母顺序命令名称的值,这不是我想要的.

from operator import itemgetter
newlist = source.sort(key=operator.itemgetter('name'))
Run Code Online (Sandbox Code Playgroud)

SIs*_*lam 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']
Run Code Online (Sandbox Code Playgroud)

输出打印 -

OrderedDict([('name', 'Homer'), ('IQ', 0), ('gender', 'male'), ('age', 39)])
Homer
OrderedDict([('name', 'Bart'), ('IQ', 0), ('gender', 'male'), ('age', 10)])
Bart
Run Code Online (Sandbox Code Playgroud)

编辑

正如评论中所讨论的那样(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']
Run Code Online (Sandbox Code Playgroud)

输出 -

OrderedDict([('name', 'Homer'), ('IQ', 0), ('gender', 'male'), ('age', 39)])
Homer
OrderedDict([('name', 'Bart'), ('IQ', 0), ('gender', 'male'), ('age', 10)])
Bart
Run Code Online (Sandbox Code Playgroud)