【问题标题】:Piecewise list comprehensions in pythonpython中的分段列表推导
【发布时间】:2010-09-24 21:46:36
【问题描述】:

在 python 中执行以下操作的最简单/最优雅的方法是什么:

def piecewiseProperty(aList):
    result = []
    valueTrue = 50
    valueFalse = 10

    for x in aList:
        if hasProperty(x):
            result.append(valueTrue)
        else
            result.append(valueFalse)

    return result

其中hasProperty 是一些具有布尔返回值的函数。

一种更短(但不透明,并且可能效率较低)的类似 R 的方法是这样的

trueIndexSet = set([ ind for ind,x in enumerate(aList) if hasProperty(x) ])
falseIndexSet = set(range(0:len(aList)).difference(trueIndexSet)
vals = sorted( [ (ind,10) for ind in falseIndexSet ] + [ (ind,50) for ind in trueIndexSet ] )
[ x for ind,x in vals]

另一种更整洁的方法是使用字典查找:

[ {True:50, False:10}[hasProperty(x)] for x in aList ]

是否有一些聪明且可读的单行或内置函数来执行此操作?它基本上是一个 if...else 列表理解。

本题的应用: 以防万一,我使用它来为网络中的节点分配大小,以便以不同的方式绘制它们。我想绘制以前缀“small_”命名的节点,大小为 10,其他节点的大小为 50。NetworkX 和 pygraphviz 可以通过接受大小列表来改变节点的大小,每个节点一个大小。

【问题讨论】:

    标签: python list list-comprehension piecewise


    【解决方案1】:

    使用conditional expression (pep-308):

    [50 if hasProperty(x) else 10 for x in alist]
    

    【讨论】:

      【解决方案2】:

      怎么样:

      [50 if hasProperty(x) else 10 for x in aList]
      

      ?

      【讨论】:

        猜你喜欢
        • 2012-05-04
        • 1970-01-01
        • 2016-02-13
        • 2012-02-22
        • 2010-11-07
        • 1970-01-01
        • 1970-01-01
        • 2010-10-28
        • 2016-04-07
        相关资源
        最近更新 更多