問題陳述:我有一個字典,其中的值有很多不同的型別,如 int、str、list、class、class 屬性、class 方法等。我想按type. 像字串一樣,串列,將是第一個然后休息。,
有人可以建議如何撰寫一個關鍵功能,以便我可以控制 sorting by type
class dummy:
a = 1
obj = dummy()
x = {'b':1,'a':'abc','c':obj, 'd':obj.a, 'e': [1,2,3]}
x = dict(sorted(x.items() , key = lambda x:type(x[1]))) #It will fail as can't compare the type
print(x)
預期輸出:
列印(x)
{'a':'abc','e': [1,2,3] ,'c':obj, 'd':obj.a, 'b':1}
uj5u.com熱心網友回復:
可能有更好的方法來做到這一點,但這個例子有效:
>>> maps = {
'str': 0,
'list': 1,
'int': 2,
'dummy': 3
}
>>> dict(sorted(x.items(), key=lambda x: maps.get(type(x[1]).__name__, 999)))
{'a': 'abc', 'e': [1, 2, 3], 'b': 1, 'd': 1, 'c': <__main__.dummy object at 0x000001C1FEB8B250>}
替代方案(相同,但lambda替換為完整的功能):
>>> maps = {
'str': 0,
'list': 1,
'int': 2,
'dummy': 3
}
>>> def sort_key(x):
value = x[1]
map_key = type(value).__name__
return maps.get(map_key, 999)
>>> dict(sorted(x.items(), key=sort_key))
{'a': 'abc', 'e': [1, 2, 3], 'b': 1, 'd': 1, 'c': <__main__.dummy object at 0x000001BE86F8BB50>}
uj5u.com熱心網友回復:
作為sorted函式的關鍵,我推薦這個函式:
lambda x: (not isinstance(x[1], str), not isinstance(x[1], list), type(x[1]).__name__)
這將映射值如下:
- 字串到元組
(False, True, 'str'); - 列出元組
(True, False, 'list'); - 元組的其他物件
(True, True, 'something else')。
由于元組按字典順序排序,和False < True,這將把字串放在第一位,串列第二,其他型別的值將按型別名稱的字母順序排序。
使用您的問題中提供的示例資料:
class dummy:
a = 1
obj = dummy()
d = {'b':1,'a':'abc','c':obj, 'd':obj.a, 'e': [1,2,3]}
d = dict(sorted(d.items() , key = lambda x: (not isinstance(x[1], str), not isinstance(x[1], list), type(x[1]).__name__)))
print(d)
{'a': 'abc', # (False, True, 'str')
'e': [1, 2, 3], # (True, False, 'list')
'c': <__main__.dummy object at 0x10f311ba8>, # (True, True, 'dummy')
'b': 1, # (True, True, 'int')
'd': 1 # (True, True, 'int')
}
uj5u.com熱心網友回復:
我認為你可以使用 str 轉換:
class dummy:
a = 1
obj = dummy()
x = {'b':1,'a':'abc','c':obj, 'd':obj.a, 'e': [1,2,3]}
x = dict(sorted(x.items() , key = lambda x:str(type(x[1])))) #It will fail as can't compare the type
print(x)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/333895.html
上一篇:如何根據模式組織陣列?
