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
whoami9894
V2EX  ›  Python

Python 中 max 函数中 key 参数的问题

  •  
  •   whoami9894 · 2018-04-10 10:33:38 +08:00 via Android · 3371 次点击
    这是一个创建于 2451 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一个字典,通过比较值返回最大值对应的键,我想到用 lambda 解析,max(dic,key=lambda i : dic[i])。 在网上看到别人有一种方法 max(dic,key=dic.get),这个把 dic.get 当做参数就有点看不懂了,有没有老哥能解释一下。

    17 条回复    2018-04-10 12:58:53 +08:00
    jmc891205
        1
    jmc891205  
       2018-04-10 10:48:39 +08:00
    哪里不懂啊 你的 lambda 表达式要实现的不就是 dict.get 的功能?
    laike9m
        2
    laike9m  
       2018-04-10 11:00:50 +08:00
    没有这么用的。要么用 lambda,要么用 operator.itemgetter
    whoami9894
        3
    whoami9894  
    OP
       2018-04-10 11:01:17 +08:00 via Android
    @jmc891205 dic.get 返回的是什么呢,这里有点不懂
    whoami9894
        4
    whoami9894  
    OP
       2018-04-10 11:01:48 +08:00 via Android
    @laike9m 但我试了 dic.get ,确实能返回正确结果
    Morriaty
        6
    Morriaty  
       2018-04-10 11:18:17 +08:00
    请搜索 python __getitem__
    whoami9894
        7
    whoami9894  
    OP
       2018-04-10 11:19:33 +08:00 via Android
    @jmc891205 嗯嗯谢谢老哥!还有一个问题想请教一下,这里的.get 不加括号 是代表 dic 的一个属性 还是 对 dic 方法的调用?
    aliao0019
        8
    aliao0019  
       2018-04-10 11:21:38 +08:00
    In [2]: di = {}

    In [3]: di.get
    Out[3]: <function get>

    In [4]: lambda i: di[i]
    Out[4]: <function __main__.<lambda>>
    ipwx
        9
    ipwx  
       2018-04-10 11:23:24 +08:00
    @laike9m 别误人子弟。dic.get 好好一成员函数,干嘛不能用?

    https://docs.python.org/3/library/stdtypes.html?highlight=dict%20get#dict.get

    @whoami9894 “函数”也是对象。dic.get 指的就是 dic.get 这个函数,没别的意思。

    顺便 dic.get 是已经绑定了 dic 这个实例的 get 成员函数。如果你用 dict.get (所以说你用 dic 这个对象名太屎了),那就是 dict 类中未绑定实例的 get 成员函数。另外一个 bonus,你有时候可以使用 dict.get(dic, i) 来调用一个未绑定的成员函数。
    whoami9894
        10
    whoami9894  
    OP
       2018-04-10 11:24:10 +08:00 via Android
    @aliao0019 懂了懂了,感谢!
    whoami9894
        11
    whoami9894  
    OP
       2018-04-10 11:24:35 +08:00 via Android
    @Morriaty 好的👌
    whoami9894
        12
    whoami9894  
    OP
       2018-04-10 11:26:52 +08:00 via Android
    @ipwx 懂了!万分感谢!
    sidewalk
        13
    sidewalk  
       2018-04-10 11:29:50 +08:00
    参数 key 接收的是 dic.get 这个函数呀
    jmc891205
        14
    jmc891205  
       2018-04-10 11:31:03 +08:00
    @whoami9894 都不是 是这个函数对象本身。max 内部会去调用它。
    laike9m
        15
    laike9m  
       2018-04-10 11:31:15 +08:00
    @ipwx 嗯是我看错了
    laike9m
        16
    laike9m  
       2018-04-10 11:38:28 +08:00
    好吧,看成了根据 key 找到 value 最大的那个 dict 了……
    ebingtel
        17
    ebingtel  
       2018-04-10 12:58:53 +08:00
    @ipwx 这不是误人子弟……毕竟 key 依赖于一个实例对象的方法,没有 operator 稳定……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5794 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 06:14 · PVG 14:14 · LAX 22:14 · JFK 01:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.