Кусочно-сложный список пониманий в python - PullRequest
2 голосов
/ 25 сентября 2010

Какой самый простой / самый элегантный способ сделать следующее в 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 могут изменять размеры узлов, принимая список размеров, по одному для каждого узла.

Ответы [ 2 ]

4 голосов
/ 25 сентября 2010

Используйте условное выражение ( pep-308 ):

[50 if hasProperty(x) else 10 for x in alist]
3 голосов
/ 25 сентября 2010

Как насчет:

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

?

...