V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
kethylar
V2EX  ›  Python

一道 Python 面试题

  •  2
     
  •   kethylar · 2016-06-18 17:19:31 +08:00 · 6831 次点击
    这是一个创建于 3079 天前的主题,其中的信息可能已经有所发展或是发生改变。

    列表排序:

    1.正数在前负数在后 2.整数从小到大 3.负数从大到小

    例: 排序前[7, -8, 5, 4, 0, -2, -5]

    排序后[0, 4, 5, 7, -2, -5, -8]

    sorted(lst, key=lambda x:_______)

    35 条回复    2016-06-22 13:20:53 +08:00
    alexapollo
        1
    alexapollo  
       2016-06-18 17:31:11 +08:00
    sorted(lst, key=lambda x: [x-7, -x][x<0])
    sorted(lst, key=lambda x: x-7 if x >= 0 else -x)

    意思一样,不知道前面是否有编译器优化
    wowpanda
        2
    wowpanda  
       2016-06-18 17:40:09 +08:00   ❤️ 2
    sorted(lst,key=lambda x:x if x>=0 else max(lst)-x)
    binux
        3
    binux  
       2016-06-18 17:41:57 +08:00   ❤️ 9
    lambda x: (x < 0, x if x > 0 else -x)
    allenling
        4
    allenling  
       2016-06-18 18:15:25 +08:00   ❤️ 6
    两步排序
    lambax: (x<0, abs(x))
    wangyongbo
        5
    wangyongbo  
       2016-06-18 18:18:05 +08:00
    我测试了一下
    sorted(l, key = lambda x: -x)
    这样就可以。
    wangyongbo
        6
    wangyongbo  
       2016-06-18 18:19:21 +08:00
    看错了。。。
    allenling
        7
    allenling  
       2016-06-18 18:20:20 +08:00
    @wangyongbo
    纳尼
    我们用的不是一个 Python ?
    wangyongbo
        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]
    wangyongbo
        9
    wangyongbo  
       2016-06-18 18:23:06 +08:00
    @allenling 看错了。
    aec4d
        10
    aec4d  
       2016-06-18 18:34:44 +08:00
    lambda x:x if x>=0 else -x<<64
    cloverstd
        11
    cloverstd  
       2016-06-18 18:44:36 +08:00
    学到新技能,原来 Python 的 Comparison Operators 还能操作 Tuples 和 lists

    https://docs.python.org/2.3/ref/comparisons.html
    Mark3K
        12
    Mark3K  
       2016-06-18 18:44:40 +08:00
    @aec4d 🐂
    SlipStupig
        13
    SlipStupig  
       2016-06-18 20:14:31 +08:00
    @wangyongbo 绝对值法果然是最简洁的
    imn1
        14
    imn1  
       2016-06-18 20:41:13 +08:00
    整数从小到大 3.负数从大到小

    这个一看就想到两个结论: 1.绝对值从小到大, 2.正数错写成了“整数”
    cloverstd
        15
    cloverstd  
       2016-06-18 20:48:55 +08:00
    @aec4d Hi
    请问能解释下为什么当 x 小于 0 时,要左移 64 位吗
    aec4d
        16
    aec4d  
       2016-06-18 21:47:41 +08:00   ❤️ 1
    @cloverstd 首先说明我这个思路并不能用于实际情况
    思路就是把负数变成正数在放在所有正数的后面(所以乘以一个很大的正数)
    向左位移 64 和乘 2 的 64 次方是一样的意思
    cloverstd
        17
    cloverstd  
       2016-06-18 21:58:33 +08:00
    @aec4d 了解了,谢谢了
    那就是有一个坑在这里,如果大于 x * 2 ** 64 的话,就嗝屁了
    Owenjia
        18
    Owenjia  
       2016-06-18 22:27:54 +08:00
    @alexapollo
    7 是 max(lst) 么?据我所知,好像要自己包装下 max ,加个 lru_cache 装饰器才会有优化。
    kethylar
        19
    kethylar  
    OP
       2016-06-18 23:06:07 +08:00
    条件 2 写错,应该是正数在前,负数在后 @all

    谢谢各位的回复
    kethylar
        20
    kethylar  
    OP
       2016-06-18 23:07:20 +08:00
    哦 又写错 应该是正数从小到大
    alexapollo
        21
    alexapollo  
       2016-06-18 23:14:39 +08:00
    @Owenjia 对,所以这里写 7 , max 放之前单独 O(n)一次
    Owenjia
        22
    Owenjia  
       2016-06-18 23:31:51 +08:00
    @alexapollo
    额,我上面说的好像不对,即便自己包装也行不通,因为 lst 的类型是 list 。
    jedihy
        23
    jedihy  
       2016-06-19 00:50:38 +08:00
    sorted(lst, key=lambda x: (max(lst) - x) if x < 0 else x)
    Maic
        24
    Maic  
       2016-06-19 21:48:43 +08:00
    @binux 简单实用
    Maic
        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)
    这个怎么就能排序了呢?
    kojirou
        26
    kojirou  
       2016-06-20 00:01:13 +08:00
    2.整数从小到大 3.负数从大到小
    负数不是整数? - -
    dalang
        27
    dalang  
       2016-06-20 00:43:43 +08:00
    @wowpanda 不需要 `max(lst)`, 直接赋个最大的整数,比如 sys.maxsize 就可以了。
    Allianzcortex
        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))
    Allianzcortex
        29
    Allianzcortex  
       2016-06-20 08:15:49 +08:00
    @Maic lambda 是匿名函数,按照上面所说,如 7 返回的是 (False,7) -2 返回的是 (True,2) -8 返回的是(True,8) 在比较的时候比较的是两个元组。优先选择 False,在都为 True 的情况下再比较负数的绝对值大小
    avatar10086
        30
    avatar10086  
       2016-06-21 15:13:19 +08:00
    avatar10086
        31
    avatar10086  
       2016-06-21 15:14:31 +08:00
    @wangyongbo 问一下那个 sorted(s,key=lambda x:(x < 0, abs(x)))
    怎么执行的,表示没看懂
    wangyongbo
        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
    avatar10086
        33
    avatar10086  
       2016-06-21 15:42:59 +08:00
    @wangyongbo 谢谢,学到老,活到老
    byteli
        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) :正数从小到大,负数按绝对值排序
    roricon
        35
    roricon  
       2016-06-22 13:20:53 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   914 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 21:57 · PVG 05:57 · LAX 13:57 · JFK 16:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.