通过多个键和 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' }}
和None
是给int
的要求,你可以用
来解决
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 0
的原始方法将 None
值转换为零,然后按排序顺序排在第一位:
sorted(marker_dict[experiment_id].values(),
key=lambda i: (i.chromosome or 0, i.linkageGroup or 0, i.positionCm or 0))
否则,您可以编写一个小函数来处理 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))
所以我有一个字典:
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' }}
和None
是给int
的要求,你可以用
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 0
的原始方法将 None
值转换为零,然后按排序顺序排在第一位:
sorted(marker_dict[experiment_id].values(),
key=lambda i: (i.chromosome or 0, i.linkageGroup or 0, i.positionCm or 0))
否则,您可以编写一个小函数来处理 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))