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

多个数据获取第一个非空值

  •  
  •   xiaoqiao24 · 2021-03-13 11:53:19 +08:00 · 1924 次点击
    这是一个创建于 1111 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个需求,获取 value1, value2, value3, value4 中第一个有数据的值(可以被 if 判断为 True),代码如下

    a = None
    if value1:
        a = value1
    if value2 and a is None:
        a = value2
    if value3 and a is None:
        a = value3
    if value4 and a is None:
        a = value4
    

    可以看到上面的代码亢长 我就想到了如下写法

    a = value1 or value2 or value3 or value4
    

    一行代码搞定

    不知各位对上面两种写法的有什么看法呢?希望大家不吝赐教。

    16 条回复    2021-03-16 09:46:25 +08:00
    pkookp8
        1
    pkookp8  
       2021-03-13 11:56:15 +08:00 via Android
    上面的为什么不写成 if...else if...else if...
    gstqc
        2
    gstqc  
       2021-03-13 11:59:28 +08:00
    1. 第一种有效率问题
    获取到第一个有数据的值后,后面的 if 仍然会运行
    应该用 if elif

    2. “有数据”定义不清晰
    0, '', False, [], {}
    这些算“有数据”吗
    以上数值的 if value1 结果都是 False
    msg7086
        3
    msg7086  
       2021-03-13 12:14:08 +08:00
    第二种无法区分假值和空值。
    不考虑区分空值的情况下直接 或 就行了。
    需要区分空值的情况用第一种。
    est
        4
    est  
       2021-03-13 12:16:19 +08:00 via Android
    filter(None, [v1, v2, ...]) 取第一个就行
    ericls
        5
    ericls  
       2021-03-13 12:29:15 +08:00 via iPhone
    next(iterable) 就行
    ericls
        6
    ericls  
       2021-03-13 12:30:19 +08:00   ❤️ 1
    next(i for i in (v1, v2, v3, ...) if i) 就行
    ericls
        7
    ericls  
       2021-03-13 12:32:18 +08:00
    如果你还想再 hacky 一点
    next(i for i in (v for k, v in locals().items() if k.startswith('value')) if i)

    可能会挨打
    WubbaLubba
        8
    WubbaLubba  
       2021-03-13 14:14:35 +08:00
    next((x for x in (value1, value2, value3, value4) if x is not None), None)
    xarthur
        9
    xarthur  
       2021-03-13 15:20:10 +08:00 via iPhone
    filter 过滤一下就行了……
    TanMusong
        10
    TanMusong  
       2021-03-13 15:28:34 +08:00
    有数据的值(可以被 if 判断为 True)
    TanMusong
        11
    TanMusong  
       2021-03-13 15:28:44 +08:00
    可以被 if 判断为 True
    TanMusong
        12
    TanMusong  
       2021-03-13 15:28:54 +08:00
    if 判断为 True
    TanMusong
        13
    TanMusong  
       2021-03-13 15:29:01 +08:00
    if 为 True
    xiaoqiao24
        14
    xiaoqiao24  
    OP
       2021-03-13 22:33:40 +08:00
    @TanMusong 意思是
    if value 可以进入 if 判断
    dengshen
        15
    dengshen  
       2021-03-14 14:46:34 +08:00 via iPhone
    find 返回 null 或者第一个符合条件的对象
    TanMusong
        16
    TanMusong  
       2021-03-16 09:46:25 +08:00
    @xiaoqiao24 所以上边为啥会有 [“有数据”定义不清晰] , [无法区分假值和空值] 哈哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3003 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 15:02 · PVG 23:02 · LAX 08:02 · JFK 11:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.