Python中的分段列表推导式

2 投票
2 回答
1008 浏览
提问于 2025-04-16 04:34

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

2 个回答

3

这样怎么样:

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

4

使用一个叫做条件表达式的东西,这个概念在pep-308中有介绍:

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

撰写回答