簡體   English   中英

如何根據不同級別的一組鍵對Python中的列表進行排序

[英]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 個元素應該是相反的。 我可以用sortedfrom 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作為你的字典,用sortedlambda解決

# 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM