Какой самый простой / самый элегантный способ сделать следующее в 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 ]
Есть ли какой-нибудь умный и читаемый-линер или встроенная функция для этого?Это было бы в основном если бы ... еще список понимания.
Применение этого вопроса: На всякий случай, если это интересно, я использую это для назначения размеров узлам в сети, чтобы они отображались по-разному.Я хочу нарисовать узлы, названные с префиксом «small_» size 10, и нарисовать другие узлы размером 50. NetworkX и pygraphviz могут изменять размеры узлов, принимая список размеров, по одному для каждого узла.