[英]How to sort a list in Python based on a set of keys in different levels
我在python
有一個字典list
。 我想key
s 對其進行排序,即首先按chain_id
,然后按start.residue_number
,然后按end.residue_number
。 在下面的list
中,第 4 個和第 6 個元素應該是相反的。 我可以用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"
}
]
我假設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'])
或者你可以在一條線上做。
sorted(d['mappings'],key=lambda x:(x['chain_id'],x['start']['residue_number'],x['end']['residue_number']))
靈感來自 leotrubach 的回答。
如果所有鍵都按降序排序,您可以使用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.