簡體   English   中英

按多個鍵和 python 中的 int 和 None 數據對字典進行排序

[英]Sort dict by multiple keys and with int and None data in python

所以我有一個命令:

marker_dict[experiment_id] = {'SM0012AQ': { 'chromosome' : 1, 'linkageGroup':8, 'positionCm' : 45,'qualityStatus' : 'A' },
 'SM0075AQ': { 'chromosome' : 1, 'linkageGroup': 7, 'positionCm' : ,'qualityStatus' : 'A' }, 
'SM0078BQ': { 'chromosome' : 3, 'linkageGroup': 78, 'positionCm' : 7,'qualityStatus' : 'B' },
'SM0079PQ': { 'chromosome' : 4, 'linkageGroup': , 'positionCm' : 80,'qualityStatus' : 'B' },
'SM0080BQ': { 'chromosome' : , 'linkageGroup': 78, 'positionCm' : 447,'qualityStatus' : 'T' }}

我想根據“i.chromosome”、“i.linkageGroup”和“i.positionCm”對我的字典進行排序

我在做什么:

marker_list = sorted(marker_dict[experiment_id].values(), key=lambda i: (i.chromosome, i.linkageGroup, i.positionCm))

我得到了:

TypeError: '<' not supported between instances of 'Nonetype' and 'int'

在 python 2 中,他們正在做:

markerList=sorted(markerDic.values(), key=operator.attrgetter('chromosome','linkageGroup','positionCm'))

你能幫幫我嗎,我迷路了!

鑒於

t = {'SM0012AQ': { 'chromosome' : 1, 'linkageGroup':8, 'positionCm' : 45,'qualityStatus' : 'A' },
    'SM0075AQ': { 'chromosome' : 1, 'linkageGroup': 7, 'positionCm' : None ,'qualityStatus' : 'A' },
    'SM0078BQ': { 'chromosome' : 3, 'linkageGroup': 78, 'positionCm' : 7,'qualityStatus' : 'B' },
    'SM0079PQ': { 'chromosome' : 4, 'linkageGroup': None, 'positionCm' : 80,'qualityStatus' : 'B' },
    'SM0080BQ': { 'chromosome' : None, 'linkageGroup': 78, 'positionCm' : 447,'qualityStatus' : 'T' }}

以及Noneint的要求,您可以使用

dict(sorted(t.items(), key=lambda i: (i[1]['chromosome'] if i[1]['chromosome'] is not None else -1, i[1]['linkageGroup'] if i[1]['linkageGroup'] is not None else -1 , i[1]['positionCm'] if i[1]['positionCm'] is not None else -1)))

我假設您擁有的數字為 0 或正數。 如果您也可以有負數,則需要將 -1 更改為非常大的負數。

結果:

{'SM0080BQ': {'chromosome': None,
  'linkageGroup': 78,
  'positionCm': 447,
  'qualityStatus': 'T'},
 'SM0075AQ': {'chromosome': 1,
  'linkageGroup': 7,
  'positionCm': None,
  'qualityStatus': 'A'},
 'SM0012AQ': {'chromosome': 1,
  'linkageGroup': 8,
  'positionCm': 45,
  'qualityStatus': 'A'},
 'SM0078BQ': {'chromosome': 3,
  'linkageGroup': 78,
  'positionCm': 7,
  'qualityStatus': 'B'},
 'SM0079PQ': {'chromosome': 4,
  'linkageGroup': None,
  'positionCm': 80,
  'qualityStatus': 'B'}}

如果您的所有值都大於零,您可以使用原始方法or 0None值轉換為零,然后按排序順序排在第一位:

sorted(marker_dict[experiment_id].values(), 
       key=lambda i: (i.chromosome or 0, i.linkageGroup or 0, i.positionCm or 0))

否則,您可以編寫一個小的 function 來處理 None 值,方法是將數字轉換為元組,該元組在值前面加上 True/False 前綴,具體取決於它不是 None。

def None1st(*numbers): return [(n is not None,n or 0) for n in numbers]

sorted(marker_dict[experiment_id].values(), 
       key=lambda i: None1st(i.chromosome, i.linkageGroup, i.positionCm))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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