【问题标题】:In python how does "if-else and for" in a dictionary comprehension work在python中,字典理解中的“if-else and for”如何工作
【发布时间】:2014-09-23 07:11:39
【问题描述】:

我对以下代码行感到困惑:

data = {n.attributes['xid']: float(n.content) if n.content else np.nan for n in graph.by_tag('value') }

字典理解由if-elsefor 循环组成。谁能解释一下代码是如何工作的?

【问题讨论】:

    标签: python python-2.7 dictionary-comprehension


    【解决方案1】:

    您对... if ... else ... conditional expression 感到困惑。它不是循环的一部分,它是为每个键值对生成值的表达式的一部分。

    字典理解至少包含一个循环,右侧有多个循环和if 过滤器,左侧有两个表达式。一个表达式产生一个键,另一个产生一个值。这两个表达式一起为结果字典构成了一个键值对:

    {key_expression: value_expression for target in iterable}
    

    条件表达式只是根据测试生成一个值。要么测试评估为真并选择一个值,要么该值为假而选择另一个:

    true_expression if test else false_expression
    

    只计算选择的表达式;如果test 最终为假,则执行false_expression 并返回结果,完全忽略true_expression

    因此,您正在查看的字典理解相当于:

    data = {}
    for n in graph.by_tag('value'):
        key = n.attributes['xid']
        value = float(n.content) if n.content else np.nan
        data[key] = value
    

    所以value 要么设置为float(n.content),要么设置为np.nan,这取决于n.content 的值(真与否)。

    【讨论】:

    • 感谢您的帮助,有没有关于列表和字典理解的教程。请经常让我对这些理解感到震惊。我更喜欢数据科学。
    • @user3796494:Python 教程covers list comprehensions;一旦你掌握了列表推导,生成器表达式以及集合和字典推导也不例外。
    • @MartijinPieters - 这两个列表理解之间有什么区别: data = {n.attributes['xid']: float(n.content) if n.content else np.nan for n in graph .by_tag('value') } data = {n.attributes['xid']: float(n.content) for n in graph.by_tag('value') if n.content else np.nan }
    • @user3796494:第二个是无效的语法。没有else 部分,你就在过滤;从考虑中删除项目,因此您最终会在字典中找到更少的项目。前者采用所有项并改变表达式中存储的值。
    • @MartijinPieters - 这两种语法有什么区别?? . Some_variable = [y for(condition) if (condition)] 和 some_variable = [y if(condition) for (condition)]。列表推导有些令人困惑。
    【解决方案2】:

    翻译有帮助吗?

    data = {}
    for n in graph.by_tag('value'):
        if n.content:
            data[n.attributes['xid']] = float(n.content)
        else:
            data[n.attributes['xid']] = np.nan
    

    【讨论】:

    • 字典理解日期 = {n.attributes['xid']: str(n.content) for n in dates.by_tag('value')}。我可以将字典理解缩写如下: dates ={} for n in dates.by_tag('value'): dates[n.attributes['xid']] =str(n.content)
    • 差不多,但您需要使用不同的变量名(您将覆盖第一行中的dates)。
    猜你喜欢
    • 2012-03-15
    • 1970-01-01
    • 2018-02-25
    • 2020-10-13
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    相关资源
    最近更新 更多