我如何首先根据它们的单位(bit/s、Kbit/s 等)对特定的字典列表进行排序,然后根据它们的值对它们进行排序
How do I sort the particular list of dictionary first on the basis of their Units (bit/s, Kbit/s, etc) and then sort them according to their value
my_lst = [
{"usage": "0.59 Kbit/s"},
{"usage": "383.34 bit/s"},
{"usage": "158.13 bit/s"},
{"usage": "4.15 Gbit/s"},
{"usage": "18.5 Mbit/s"},
{"usage": "45 Kbit/s"}
]
尝试实现的输出应该是这样的,带有排序值:-
my_lst = [
{'usage': '4.15 Gbit/s'},
{'usage': '18.5 Mbit/s'},
{'usage': '45 Kbit/s'},
{'usage': '0.59 Kbit/s'},
{'usage': '383.34 bit/s'},
{'usage': '158.13 bit/s'}
]
单向使用 humanfriendly.parse_size
:
from humanfriendly import parse_size
sorted(my_lst, key=lambda x: parse_size(x["usage"]), reverse=True)
输出:
[{'usage': '4.15 Gbit/s'},
{'usage': '18.5 Mbit/s'},
{'usage': '45 Kbit/s'},
{'usage': '0.59 Kbit/s'},
{'usage': '383.34 bit/s'},
{'usage': '158.13 bit/s'}]
您可以使用 humanfriendly
模块:
from humanfriendly import parse_size
print(sorted(my_lst, key=lambda x: parse_size(x["usage"])[::-1])
使用 humanfriendly
库的其他答案是更好的解决方案。这里只是一个不使用库的替代方案。
from decimal import Decimal
UNIT_MAPPINGS = {
"": 1,
"K": pow(10, 3),
"M": pow(10, 6),
"G": pow(10, 9),
}
my_lst = [
{"usage": "0.59 Kbit/s"},
{"usage": "383.34 bit/s"},
{"usage": "158.13 bit/s"},
{"usage": "4.15 Gbit/s"},
{"usage": "18.5 Mbit/s"},
{"usage": "45 Kbit/s"}
]
def convert_rate(rate):
num, _, unit = rate['usage'].partition(" ")
unit = unit.replace('bit/s', '')
return Decimal(num) * UNIT_MAPPINGS[unit]
my_lst.sort(key=convert_rate, reverse=True)
print(my_lst)
输出
[{'usage': '4.15 Gbit/s'}, {'usage': '18.5 Mbit/s'}, {'usage': '45 Kbit/s'}, {'usage': '0.59 Kbit/s'}, {'usage': '383.34 bit/s'}, {'usage': '158.13 bit/s'}]
my_lst = [
{"usage": "0.59 Kbit/s"},
{"usage": "383.34 bit/s"},
{"usage": "158.13 bit/s"},
{"usage": "4.15 Gbit/s"},
{"usage": "18.5 Mbit/s"},
{"usage": "45 Kbit/s"}
]
尝试实现的输出应该是这样的,带有排序值:-
my_lst = [
{'usage': '4.15 Gbit/s'},
{'usage': '18.5 Mbit/s'},
{'usage': '45 Kbit/s'},
{'usage': '0.59 Kbit/s'},
{'usage': '383.34 bit/s'},
{'usage': '158.13 bit/s'}
]
单向使用 humanfriendly.parse_size
:
from humanfriendly import parse_size
sorted(my_lst, key=lambda x: parse_size(x["usage"]), reverse=True)
输出:
[{'usage': '4.15 Gbit/s'},
{'usage': '18.5 Mbit/s'},
{'usage': '45 Kbit/s'},
{'usage': '0.59 Kbit/s'},
{'usage': '383.34 bit/s'},
{'usage': '158.13 bit/s'}]
您可以使用 humanfriendly
模块:
from humanfriendly import parse_size
print(sorted(my_lst, key=lambda x: parse_size(x["usage"])[::-1])
使用 humanfriendly
库的其他答案是更好的解决方案。这里只是一个不使用库的替代方案。
from decimal import Decimal
UNIT_MAPPINGS = {
"": 1,
"K": pow(10, 3),
"M": pow(10, 6),
"G": pow(10, 9),
}
my_lst = [
{"usage": "0.59 Kbit/s"},
{"usage": "383.34 bit/s"},
{"usage": "158.13 bit/s"},
{"usage": "4.15 Gbit/s"},
{"usage": "18.5 Mbit/s"},
{"usage": "45 Kbit/s"}
]
def convert_rate(rate):
num, _, unit = rate['usage'].partition(" ")
unit = unit.replace('bit/s', '')
return Decimal(num) * UNIT_MAPPINGS[unit]
my_lst.sort(key=convert_rate, reverse=True)
print(my_lst)
输出
[{'usage': '4.15 Gbit/s'}, {'usage': '18.5 Mbit/s'}, {'usage': '45 Kbit/s'}, {'usage': '0.59 Kbit/s'}, {'usage': '383.34 bit/s'}, {'usage': '158.13 bit/s'}]