2010-11-20 5 views
6

Глядя на этот фрагмент кода Python Я написал:Есть ли лучший способ сделать этот код на Python?

return map(lambda x: x[1], 
      filter(lambda x: x[0] == 0b0000, 
        my_func(i) 
       ) 
     ) 

(Надеясь это само за себя)

Я интересно, если питон имеет лучший способ сделать это?

Я изучил python несколько месяцев назад, написал несколько сценариев и не использовал его с тех пор. Это ставит меня в странное место для обучения, потому что я знаю достаточно, чтобы делать то, что я хочу, но у меня нет инстинкта новичка, чтобы найти «правильный» способ. Я надеюсь, что этот вопрос поставит меня на курсе ...

+0

Я предполагаю, что 'my_func()' возвращает список списков? –

ответ

9

Я думаю, что вы хотите, список понимание:

[x[1] for x in my_func(i) if x[0] == 0] 

Сводка списков - очень распространенная идиома Python.

2

Вы могли бы использовать что-то вроде:

return [x[1] for x in my_func(i) if x[0] == 0b0000] 

Многих людей назвали бы, что «лучше», как его немного короче и более очевидным.

(.. Я был бы соблазн рассмотреть превратить его в простой цикл, и если заявление Функциональное программирование хороший, но простые петли слишком хорошо)

+0

Как цикл 'for' лучше или более очевиден? Понимание списка является более читаемым, как только вы привыкнете к нему. – aaronasterling

+1

Вы хотите назначить 'x [0]'? или это значит быть '=='? –

+1

@ Russell Dias: Он означает '==', потому что в противном случае синтаксическая ошибка. –

1

Если вы пишете в Python 3.x, то вы могли бы написать эффективное выражение генератора, например, как это: return (x[1] for x in my_func(i) if not x[0])

+5

Почему вы говорите «Python 3.x»? Это хорошо работает в Python 2. –

+0

Существует различие между 'map' в Python 2.x и 3.x. В прошлый раз, когда я проверил, 'map' в 2.x вернул список, но действует как генератор в 3.x. –

1

В Python 3.x вы можете использовать распаковку, чтобы избежать использования x[0] и x[1]. Кроме того, вы можете рассмотреть возможность возвращения выражения генератора вместо списка-понимание, если вы только хотите, чтобы перебрать результат сразу:

return (y for x,y,*z in my_func(i) if x == 0b0000) 
Смежные вопросы