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