[英]How to sort a list in Python based on a set of keys in different levels
I have a list
of dictionaries in python
.我在python
有一个字典list
。 I want to sort it by key
s ie, first by chain_id
, then by start.residue_number
and then by end.residue_number
.我想key
s 对其进行排序,即首先按chain_id
,然后按start.residue_number
,然后按end.residue_number
。 In the list
below, the 4th and 6th element should be coming the other way around.在下面的list
中,第 4 个和第 6 个元素应该是相反的。 I could use sorted
with from operator import itemgetter, attrgetter
to sort on chain_id
, but how to do same with a dictionary
inside dictionary
?我可以用sorted
与from operator import itemgetter, attrgetter
进行排序chain_id
,但如何做同样的用dictionary
里面dictionary
?
"mappings": [
{
"entity_id": 1,
"end": {
"residue_number": 63
},
"start": {
"residue_number": 1
},
"chain_id": "A",
"struct_asym_id": "A"
},
{
"entity_id": 1,
"end": {
"residue_number": 116
},
"start": {
"residue_number": 1
},
"chain_id": "A",
"struct_asym_id": "A"
},
{
"entity_id": 1,
"end": {
"residue_number": 124
},
"start": {
"residue_number": 1
},
"chain_id": "A",
"struct_asym_id": "A"
},
{
"entity_id": 1,
"end": {
"residue_number": 116
},
"start": {
"residue_number": 1
},
"chain_id": "B",
"struct_asym_id": "B"
},
{
"entity_id": 1,
"end": {
"residue_number": 124
},
"start": {
"residue_number": 1
},
"chain_id": "B",
"struct_asym_id": "B"
},
{
"entity_id": 1,
"end": {
"residue_number": 63
},
"start": {
"residue_number": 1
},
"chain_id": "B",
"struct_asym_id": "B"
}
]
I assumed d
as your dict, Solved with sorted
and lambda
我假设d
作为你的字典,用sorted
和lambda
解决
# Sort with chain_id
In [93]: sort_1 = sorted(d['mappings'],key=lambda x:x['chain_id'])
# Sort with start residue number
In [94]: sort_2 = sorted(sort_1,key=lambda x:x['start']['residue_number'])
# Sort with end residue number
In [95]: sort_3 = sorted(sort_2,key=lambda x:x['end']['residue_number'])
Or you can do in a line.或者你可以在一条线上做。
sorted(d['mappings'],key=lambda x:(x['chain_id'],x['start']['residue_number'],x['end']['residue_number']))
Inspired from leotrubach's answer.灵感来自 leotrubach 的回答。
If all of the keys are to be sorted in descending order you could use list.sort()
or sorted()
functions and create a tuple returning key function:如果所有键都按降序排序,您可以使用list.sort()
或sorted()
函数并创建一个返回键函数的元组:
print(
sorted(
mappings,
key=lambda x: (
x['chain_id'],
x['start']['residue_number'],
x['end']['residue_number']
)
)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.