Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据通过函数传递的值对字典进行排序?_Python_Sorting_Dictionary_Lambda_Strptime - Fatal编程技术网

Python 如何根据通过函数传递的值对字典进行排序?

Python 如何根据通过函数传递的值对字典进行排序?,python,sorting,dictionary,lambda,strptime,Python,Sorting,Dictionary,Lambda,Strptime,我有一个名为“times”的字典,它将键映射到表示时间的字符串值: times = {'key1': '12.23', 'key2': '43:53.29', 'key3': '1:38:11.50r'} 该字符串的格式为[hours]:[minutes]:[seconds]。[microsides][r] 其中每个字段都是可选的。r是一个标志,它不依赖于所填充的任何其他值,也不考虑排序。[hours]要求[minutes]和[down]存在,但[minutes]不要求[hours]存在 我想

我有一个名为“times”的字典,它将键映射到表示时间的字符串值:

times = {'key1': '12.23', 'key2': '43:53.29', 'key3': '1:38:11.50r'}
该字符串的格式为[hours]:[minutes]:[seconds]。[microsides][r] 其中每个字段都是可选的。r是一个标志,它不依赖于所填充的任何其他值,也不考虑排序。[hours]要求[minutes]和[down]存在,但[minutes]不要求[hours]存在

我想以一个键列表结束,这些键按其值的时间顺序排序

我有以下资料:

standings = sorted(times, key=times.__getitem__)
standings = sorted(times.items(),key = lambda t : t[0])
但它仅基于字符串值进行排序。我是python新手,但如果我使用java,我可能会编写一个带有自定义compareTo()函数的时间类来实现排序


我可以编写一个函数,将字符串转换为以毫秒为单位的时间,然后根据该时间进行排序,但不知道如何使用sorted()函数中的“key=”来完成此操作。

您可以执行以下操作:

standings = sorted(times, key=times.__getitem__)
standings = sorted(times.items(),key = lambda t : t[0])
它假定您希望按字典的键进行排序。如果要按值排序,请将t[0]替换为t[1]

请注意,我使用t[0]获取对键的引用作为示例,但在您的示例中,您可能会引用t[1],但您可能会将此值传递给一个函数,该函数将时间转换为字符串格式,以便按字典排序。例如,假设您有一个time_格式方法,该方法返回一个填充的时间,那么您将用time_格式(t[1])替换上面的t[0]

或者更简洁的方式:

[key for _, key in sorted((as_list(v), k) for k, v in times.items())]
这是因为Python中的列表或元组是按字典顺序排序的。假设您有如下列表:

>>> l = [[0, 1], [-1 , 2, 3], [4, 5], [0, -1]]
您可以在其上调用
sorted

>>> sorted(l)
[[-1, 2, 3], [0, -1], [0, 1], [4, 5]]
因此,所有的魔法

关于
[0]*(4-len(times))+times
您可以在此处阅读更多内容:


长话短说
some_list*some_integer
创建一个包含
some_list
重复
some_integer
次元素的列表。

我想您可以定义一个函数to_decimal将时间字符串转换为十进制进行比较,然后:

standings = sorted(times, key = lambda x : to_decimal(times[x]))

什么是
'1:38:11.50r'
中的
50r
?半秒,在中继中(这些是比赛时间)。“r”只是一个标志,它对于排序目的没有任何意义,它给了我一个排序后的值列表。我需要一个键列表,按它们的值的函数排序。所以{Bob:2,Jim:5,Billy:3}会产生类似于[Bob,Billy,Jim]的结果,看起来这是可行的!我理解基于“:”和“.”的拆分,忽略任何非数字字符。你能解释一下“如果len(times)==4 else[0]*(4-len(times))+次返回时间”和“[k代表k,t在排序中(times.items(),key=lambda x:as_list(x[1])]”吗?你不需要
\。
[]
没有特殊意义。另外,使用原始字符串。@zero323是的,这很有帮助。谢谢大家!@第四次更新,谢谢。我最近花了很多时间在R上,我觉得我必须逃避一切,然后再逃避一次。你怎么转换成十进制?我不确定1.43.23.43是否有效。我想您需要解析字符串以确定每个部分的单位,然后求和到小数点。那么您的意思是将时间转换为毫秒,然后排序?