我有一个元组列表,我试图按日期排序,然后按最大数字排序。所以基本上当你有两个相同的日期时,它会将元组放在最前面。见下面的例子。
我的元组列表
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']]
对此的任何帮助将不胜感激。
由于
答案 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}}"