列表排序:
1.正数在前负数在后 2.整数从小到大 3.负数从大到小
例: 排序前[7, -8, 5, 4, 0, -2, -5]
排序后[0, 4, 5, 7, -2, -5, -8]
sorted(lst, key=lambda x:_______)
![]() | 1 alexapollo 2016-06-18 17:31:11 +08:00 sorted(ls, key=lambda x: [x-7, -x][x<0]) sorted(lst, key=lambda x: x-7 if x >= 0 else -x) 意思一样,不知道前面是否有编译器优化 |
2 wowpanda 2016-06-18 17:40:09 +08:00 ![]() sorted(lst,key=lambda x:x if x>=0 else max(lst)-x) |
![]() | 3 binux 2016-06-18 17:41:57 +08:00 ![]() lambda x: (x < 0, x if x > 0 else -x) |
![]() | 4 allenling 2016-06-18 18:15:25 +08:00 ![]() 两步排序 lambax: (x<0, abs(x)) |
![]() | 5 wangyongbo 2016-06-18 18:18:05 +08:00 我测试了一下 sorted(l, key = lambda x: -x) 这样就可以。 |
![]() | 6 wangyongbo 2016-06-18 18:19:21 +08:00 看错了。。。 |
![]() | 7 allenling 2016-06-18 18:20:20 +08:00 |
![]() | 8 wangyongbo 2016-06-18 18:22:14 +08:00 sorted(l, key = lambda x: (x < 0, abs(x))) [0, 4, 5, 7, -2, -5, -8] |
![]() | 9 wangyongbo 2016-06-18 18:23:06 +08:00 @allenling 看错了。 |
![]() | 10 aec4d 2016-06-18 18:34:44 +08:00 lambda x:x if x>=0 else -x<<64 |
![]() | 11 cloverstd 2016-06-18 18:44:36 +08:00 学到新技能,原来 Python 的 Comparison Operators 还能操作 Tuples 和 lists https://docs.python.org/2.3/ref/comparisons.html |
![]() | 13 SlipStupig 2016-06-18 20:14:31 +08:00 @wangyongbo 绝对值法果然是最简洁的 |
![]() | 14 imn1 2016-06-18 20:41:13 +08:00 整数从小到大 3.负数从大到小 这个一看就想到两个结论: 1.绝对值从小到大, 2.正数错写成了“整数” |
![]() | 16 aec4d 206-06-18 21:47:41 +08:00 ![]() |
![]() | 18 Owenjia 2016-06-18 22:27:54 +08:00 @alexapollo 7 是 max(lst) 么?据我所知,好像要自己包装下 max ,加个 lru_cache 装饰器才会有优化。 |
20 0xLeco OP 哦 又写错 应该是正数从小到大 |
![]() | 21 alexapollo 2016-06-18 23:14:39 +08:00 @Owenjia 对,所以这里写 7 , max 放之前单独 O(n)一次 |
![]() | 22 Owenjia 2016-06-18 23:31:51 +08:00 @alexapollo 额,我上面说的好像不对,即便自己包装也行不通,因为 lst 的类型是 list 。 |
![]() | 23 jedihy 2016-06-19 00:50:38 +08:00 sorted(lst, key=lambda x: (max(lst) - x) if x < 0 else x) |
25 Maic 2016-06-19 22:19:09 +08:00 @wangyongbo 能解释一下怎么回事吗?谢谢了。 语法: sorted(iterable[, key][, reverse]), 你写的 key = lambda x: (x < 0, abs(x))) 这个如果是 2 ,就是 key = (False, 2) 这个怎么就能排序了呢? |
26 kojirou 2016-06-20 00:01:13 +08:00 2.整数从小到大 3.负数从大到小 负数不是整数? - - |
![]() | 28 Allianzcortex 2016-06-20 08:03:37 +08:00 mark.自己一开始用的是 magicnumber ,sorted(l,key=lambda x:x if x>=0 else abs(x)+100) 最后直接这样: sorted(l,key=lambda x:x if x>=0 else abs(x)+max(l)) |
![]() | 29 Allianzcortex 2016-06-20 08:15:49 +08:00 @Maic lambda 是匿名函数,按照上面所说,如 7 返回的是 (False,7) -2 返回的是 (True,2) -8 返回的是(True,8) 在比较的时候比较的是两个元组。优先选择 False,在都为 True 的情况下再比较负数的绝对值大小 |
30 avatar10086 2016-06-21 15:13:19 +08:00 |
31 avatar10086 2016-06-21 15:14:31 +08:00 @wangyongbo 问一下那个 sorted(s,key=lambda x:(x < 0, abs(x))) 怎么执行的,表示没看懂 |
![]() | 32 wangyongbo 2016-06-21 15:30:45 +08:00 @avatar10086 http://peiqiang.net/2015/01/20/in-python-you-sort-with-a-tuple.html 先比较第一个元素,再比较第二个元素 false < true sorted([True, False, False, True]) [False, False, True, True] False == 0 True >>> True == 1 True >>> False < True True |
33 avatar10086 2016-06-21 15:42:59 +08:00 @wangyongbo 谢谢,学到老,活到老 |
![]() | 34 byteli 2016-06-21 16:27:34 +08:00 从楼上学习了,试着理解了下 lambda x: (x<0, abs(x) )这里 lambda 返回一个二元组作为 key 的排序条件,也即先对 x<0 :若 x>=0 则得到 False , x<0 则 True ,排序时 False 排在 True 前面,则实现了 1.正数在前负数在后 而后对条件 abs(x) :正数从小到大,负数按绝对值排序 |
![]() | 35 roricon 2016-06-22 13:20:53 +08:00 |