2017-12-27 317 views
2

我有一个航班清单,它将在出发日期首先进行排序,然后按航班总航程排序,并根据日期保留其排序。通过多种方法对列表进行排序

  • 调用出发日期是“Flight”对象的一种方法。
  • 调用飞行时间也是“飞行”对象的一种方法。

输出应该是:

  • 2017年4月7日flighttime:05:00
  • 2017年4月7日flighttime:06:00
  • 2017年5月7日flighttime:04 :00
  • 2017年5月7日flighttime:05:00

我想:

sorted(flights, key=methodcaller('date','flighttime')) 

但methodcaller只需要1个参数。我先尝试了groupby,然后在飞行时间进行排序,但是这个列表只能按飞行时间排序。

谢谢

回答

2

methodcaller不能调用超过1点的方法,其他的参数是参数:

F = methodcaller( '名', '富',酒吧= 1),调用F (二)返回b.name( '富',酒吧= 1)

因此,它可以使用methodcaller但在一个更加复杂的方式可能涉及lambda像(未经测试)lambda x : methodcaller('name')(x),methodcaller('flighttime')(x)

进行

所以我会用一个简单的lambda代替(其中xFlight对象):

sorted(flights, key=lambda x : (x.date(),x.flighttime())) 
+0

谢谢!如果我想维护日期顺序,但是要颠倒飞行时间顺序?因此只能在第二个键上换向? – Ward

+0

如果飞行时间是数值,你可以倒过来第二个键:'sorted(flights,key = lambda x:(x.date(), - x.flighttime()))' –

+0

不是它是一个timedelta,但它工作通过放在前面!谢谢 – Ward

相关问题