尝试按日期排序python中的元组列表,然后按最大数字排序

时间:2016-09-03 23:58:30

标签: 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"]]

然后我按照元组中的日期对列表进行排序。

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']]

对此的任何帮助将不胜感激。

由于

3 个答案:

答案 0 :(得分:3)

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

from datetime import datetime
strp = datetime.strptime

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

或者只是将日期的顺序拆分并反转​​为 yyyy,mm,dd:

def iso(sub):
    mm, dd, yy = sub.split("/")
    return yy, mm, dd

srted = sorted(dataLst, key=lambda sub: (iso(sub[2]), -sub[1]))

两者都给你相同的输出:

 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

答案 1 :(得分:2)

你需要改变各种秩序 - " tie-breakers"在" main"之前完成排序是有效的,因为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']]

答案 2 :(得分:0)

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

Text = "{Binding Path=Content, 
         RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Button}}"