如何强制特定键始终位于字典的开头.例如,如果我有这样的词典列表:
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)
我会尝试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)
| 归档时间: |
|
| 查看次数: |
1881 次 |
| 最近记录: |