2

在 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 可以通过接受大小列表来改变节点的大小,每个节点一个大小。

4

2 回答 2

4

使用条件表达式( pep-308 ):

[50 if hasProperty(x) else 10 for x in alist]
于 2010-09-24T21:49:04.070 回答
3

怎么样:

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

?

于 2010-09-24T21:49:05.080 回答