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