Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_List_Sorting - Fatal编程技术网

尝试在python中对元组列表进行排序,首先按日期排序,然后按最大数排序

尝试在python中对元组列表进行排序,首先按日期排序,然后按最大数排序,python,list,sorting,Python,List,Sorting,我有一个元组列表,我试图按日期排序,然后按最大数排序。所以,基本上,当你有两个相同的日期时,它会把数字最大的元组放在第一位。见下面的例子 我的元组列表 dataLst = [["Mike", 50, "08/10/2016"], ["Bob", 100, "08/10/2016"], ["Dave", 500, "08/01/2016"], ["Paul", -50, "08/20/2016"], ["Sam", 250, "08/30/2016"]] 然后我按照元组中的日期对列表进行排序。

我有一个元组列表,我试图按日期排序,然后按最大数排序。所以,基本上,当你有两个相同的日期时,它会把数字最大的元组放在第一位。见下面的例子

我的元组列表

dataLst = [["Mike", 50, "08/10/2016"], ["Bob", 100, "08/10/2016"], ["Dave", 500, "08/01/2016"], ["Paul", -50, "08/20/2016"], ["Sam", 250, "08/30/2016"]]
然后我按照元组中的日期对列表进行排序。

sDataLst = sorted(dataLst, key=operator.itemgetter(2))
sorted(sDataLst,key=operator.itemgetter(1), reverse=True) 
print sDataLst

[['Dave', 500, '08/01/2016'], ['Mike', 50, '08/10/2016'], ['Bob', 100, '08/10/2016'], ['Paul', -50, '08/20/2016'], ['Sam', 250, '08/30/2016']]
然后,我按数字的相反顺序对已排序的列表进行排序。

sDataLst = sorted(dataLst, key=operator.itemgetter(2))
sorted(sDataLst,key=operator.itemgetter(1), reverse=True) 
print sDataLst

[['Dave', 500, '08/01/2016'], ['Mike', 50, '08/10/2016'], ['Bob', 100, '08/10/2016'], ['Paul', -50, '08/20/2016'], ['Sam', 250, '08/30/2016']]
当我打印排序后的列表时,我得到以下信息。

sDataLst = sorted(dataLst, key=operator.itemgetter(2))
sorted(sDataLst,key=operator.itemgetter(1), reverse=True) 
print sDataLst

[['Dave', 500, '08/01/2016'], ['Mike', 50, '08/10/2016'], ['Bob', 100, '08/10/2016'], ['Paul', -50, '08/20/2016'], ['Sam', 250, '08/30/2016']]
如果您查看列表中日期相同的第二项和第三项,则应将其颠倒,因为第三项中的数字大于第二项中的数字。我所寻找的结果如下

[['Dave', 500, '08/01/2016'], ['Bob', 100, '08/10/2016'], ['Mike', 50, '08/10/2016'], ['Paul', -50, '08/20/2016'], ['Sam', 250, '08/30/2016']]
在此方面的任何帮助都将不胜感激


谢谢

由于mm/dd/yyyy的顺序,您无法将日期作为字符串进行比较,您可以使用datetime来:

或者将日期拆分并颠倒为yyyy、mm、dd:

两者都提供相同的输出:

 In [24]: sorted(dataLst, key=lambda sub: (iso( sub[2]), -sub[1]))Out[24]: 
[['Dave', 500, '08/01/2016'],
 ['Bob', 100, '08/10/2016'],
 ['Mike', 50, '08/10/2016'],
 ['Paul', -50, '08/20/2016'],
 ['Sam', 250, '08/30/2016']]

In [25]: sorted(dataLst, key=lambda sub: (strp(sub[2],"%m/%d/%Y"), -sub[1]))

Out[25]: 
[['Dave', 500, '08/01/2016'],
 ['Bob', 100, '08/10/2016'],
 ['Mike', 50, '08/10/2016'],
 ['Paul', -50, '08/20/2016'],
 ['Sam', 250, '08/30/2016']]
不同之处在于,拆分速度要快得多,如下所示:

In [28]: timeit  sorted(dataLst, key=lambda sub: (strp(sub[2],"%m/%d/%Y"), -sub[1]))
10000 loops, best of 3: 66.4 µs per loop

In [29]: timeit sorted(dataLst, key=lambda sub: (iso( sub[2]), -sub[1]))
100000 loops, best of 3: 4.97 µs per loop

您需要颠倒排序顺序-在“主”排序之前完成“平分符”,这是因为Python的排序是稳定的,所以当排序到主顺序时,它们保留平分符的顺序,例如:

from datetime import datetime
from operator import itemgetter

dataLst = [["Mike", 50, "08/10/2016"], ["Bob", 100, "08/10/2016"], ["Dave", 500, "08/01/2016"], ["Paul", -50, "08/20/2016"], ["Sam", 250, "08/30/2016"]]
# Sort the tie breaker first
dataLst.sort(key=itemgetter(1), reverse=True)
# Sort on the main key - here we'll use `strptime` to sort as a proper date
dataLst.sort(key=lambda L: datetime.strptime(L[2], '%m/%d/%Y'))
这使得:

[['Dave', 500, '08/01/2016'],
 ['Bob', 100, '08/10/2016'],
 ['Mike', 50, '08/10/2016'], # Bob and Mike properly ordered...
 ['Paul', -50, '08/20/2016'],
 ['Sam', 250, '08/30/2016']]

与@Ninja Puppy的答案类似,但在一次排序迭代中,而不是两次:

dataLst.sort(key=lambda l: (datetime.strptime(l[2], '%m/%d/%Y'), -l[1]))

您知道以mm/dd/yyyyy格式排序的日期不会按日期顺序排序,对吗?是的,我知道这一点,但因为我选择了mm/dd/yyyy,所以当作为字符串值传递时,它将正确排序。但是谢谢你的留言。今后我会记住这一点。不。。。它们不会正确排序
2015年12月31日
不会在2016年1月1日之前出现,是吗?这不应该是
-sub[1]
吗?它在这里使用双倍很好地工作,但当您有不同的类型或更复杂的订购时就没那么有用了…:p(在Mike之前需要Bob…@Ninjappy,没有意识到他们想要改变领带的种类,我专注于这样一个事实:他们比较的日期完全错误。固定的;)谢谢忍者小狗。哦,我没读他的答案。我想说同样的话太长了:)