2010-09-24 49 views
2

什麼是最簡單/最優雅的方式做在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可以通過接受一個大小列表來改變節點的大小,每個節點一個大小。

回答

3

如何:

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