我的字典看起来像这样:
myDict = {
'SER12346': {'serial_num': 'SER12346', 'site_location': 'North America'},
'ABC12345': {'serial_num': 'ABC12345', 'site_location': 'South America'},
'SER12345': {'serial_num': 'SER12345', 'site_location': 'North America'},
'SER12347': {'serial_num': 'SER12347', 'site_location': 'South America'},
'ABC12346': {'serial_num': 'ABC12346', 'site_location': 'Europe'}
}
我的目标是按每个子词典的site_location
和serial_num
对此词典进行排序。
使用我在这个问题中找到的代码 - Sort a dictionary of dictionaries python - 我能够对它进行排序,但这并不是我所期待的。
这是我的代码:
import pprint
items = ((k, k2, v) for k in myDict for k2, v in myDict[k].items())
ordered = sorted(items, key=lambda x:x[-1], reverse=False)
pprint.pprint(ordered)
这是我得到的结果:
[('ABC12346', 'site_location', 'Europe'),
('SER12345', 'site_location', 'North America'),
('SER12346', 'site_location', 'North America'),
('SER12347', 'site_location', 'South America'),
('ABC12345', 'site_location', 'South America'),
('ABC12346', 'serial_num': 'ABC12346'),
('SER12345', 'serial_num': 'SER12345'),
('SER12346', 'serial_num': 'SER12346'),
('SER12347', 'serial_num': 'SER12347'),
('ABC12345', 'serial_num': 'ABC12345')]
我期待更像这样的东西:
{
'ABC12346': {'serial_num': 'ABC12346', 'site_location': 'Europe'}
'SER12345': {'serial_num': 'SER12345', 'site_location': 'North America'},
'SER12346': {'serial_num': 'SER12346', 'site_location': 'North America'},
'SER12347': {'serial_num': 'SER12347', 'site_location': 'South America'},
'ABC12345': {'serial_num': 'ABC12345', 'site_location': 'South America'},
}
实际结果是分隔序列号和站点位置。我想将它们放在已排序的对象中。我怎么能这样做?
答案 0 :(得分:4)
这是你想要的吗?
dicts = [{k: v} for (k,v) in myDict.items()]
dicts.sort(key=lambda d: (d.values()[0]['site_location'], d.values()[0]['serial_num'],))
做的输出:
import pprint
pprint.pprint(dicts)
是:
[{'ABC12346': {'serial_num': 'ABC12346', 'site_location': 'Europe'}},
{'SER12345': {'serial_num': 'SER12345', 'site_location': 'North America'}},
{'SER12346': {'serial_num': 'SER12346', 'site_location': 'North America'}},
{'ABC12345': {'serial_num': 'ABC12345', 'site_location': 'South America'}},
{'SER12347': {'serial_num': 'SER12347', 'site_location': 'South America'}}]
编辑:我正在为输出格式提供答案,但这可能更有意义:
dicts = myDict.items()
dicts.sort(key=lambda (k,d): (d['site_location'], d['serial_num'],))
输出:
[('ABC12346', {'serial_num': 'ABC12346', 'site_location': 'Europe'}),
('SER12345', {'serial_num': 'SER12345', 'site_location': 'North America'}),
('SER12346', {'serial_num': 'SER12346', 'site_location': 'North America'}),
('ABC12345', {'serial_num': 'ABC12345', 'site_location': 'South America'}),
('SER12347', {'serial_num': 'SER12347', 'site_location': 'South America'})]
答案 1 :(得分:1)
字典不保留项目的顺序 - 因此无法排序。如果要显示已排序字典的外观,则需要创建排序列表,然后将其插入到OrderedDict类中。下面的代码片段说明了这一点:
from collections import OrderedDict
myDict = {
'SER12346': {'serial_num': 'SER12346', 'site_location': 'North America'},
'ABC12345': {'serial_num': 'ABC12345', 'site_location': 'South America'},
'SER12345': {'serial_num': 'SER12345', 'site_location': 'North America'},
'SER12347': {'serial_num': 'SER12347', 'site_location': 'South America'},
'ABC12346': {'serial_num': 'ABC12346', 'site_location': 'Europe'}
}
def sortfun(d):
return (d[1]['site_location'], d[1]['serial_num'])
skv = sorted(myDict.iteritems(), key=sortfun)
sorted_dict = OrderedDict(skv)
print sorted_dict
答案 2 :(得分:1)
>>> import pprint
>>> dic=myDict.items()
>>> dic.sort(key=lambda x:(x[1]['site_location'],x[1]['serial_num']))
>>> pprint.pprint([{k:v} for k,v in dic])
[{'ABC12346': {'serial_num': 'ABC12346', 'site_location': 'Europe'}},
{'SER12345': {'serial_num': 'SER12345', 'site_location': 'North America'}},
{'SER12346': {'serial_num': 'SER12346', 'site_location': 'North America'}},
{'ABC12345': {'serial_num': 'ABC12345', 'site_location': 'South America'}},
{'SER12347': {'serial_num': 'SER12347', 'site_location': 'South America'}}]
答案 3 :(得分:0)
我有一个cmp
的解决方案(我认为你必须使用它,因为我们使用了两个键的组合)但它不是很漂亮,我猜它可以改进:
>>> pprint(sorted(myDict.items(), cmp=lambda x, y: cmp((x[1]['site_location'], x[1]['serial_num']), (y[1]['site_location'], y[1]['serial_num']))))
[('ABC12346', {'serial_num': 'ABC12346', 'site_location': 'Europe'}),
('SER12345', {'serial_num': 'SER12345', 'site_location': 'North America'}),
('SER12346', {'serial_num': 'SER12346', 'site_location': 'North America'}),
('ABC12345', {'serial_num': 'ABC12345', 'site_location': 'South America'}),
('SER12347', {'serial_num': 'SER12347', 'site_location': 'South America'})]