如何强制特定键始终位于字典的开头。 例如。如果我有这样的词典列表:
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'))
答案 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