Почему в Python Tutorial говорится, что списочное понимание более гибкое, чем map ()? - PullRequest
3 голосов
/ 08 сентября 2011

В Python Tutorial написано:

enter image description here

Почему? Я не вижу, как понимание «более гибкое». Мне кажется, это только разница в синтаксисе. Я легко могу сделать:

def my_round(i):
    return str(round(355/113.0, i))

a = map(my_round, range(1, 6))

Я не понимаю, как map() здесь не хватает гибкости.

Кто-нибудь может уточнить?

Ответы [ 7 ]

6 голосов
/ 08 сентября 2011

Разница относительно мала, но вы должны написать полноценный def, включающий имя или lambda, чтобы использовать нетривиальные выражения с map, тогда как вы можете просто пойти и использоватьих в списке понимания.Кроме того, списки включают в себя фильтрацию, в то время как вам понадобится отдельный filter вызов для этого (неэффективно, и паренсы быстро выходят за рамки того, что можно легко управлять).

6 голосов
/ 08 сентября 2011

Списки могут содержать вложенные циклы и условные выражения:

nonzeros = [val for y in rows
                for val in y.cols
                if val != 0]
1 голос
/ 08 сентября 2011

map требует от вас определения my_round, а LC - нет.

Никто не говорил, что разница огромна; -)

1 голос
/ 08 сентября 2011
[ str(round(355/113.0, i)) for i in range(1,12) if prime(i) ]
0 голосов
/ 14 февраля 2012

Как уже говорили другие, разница невелика, но есть случаи, когда понимание списка имеет заметное преимущество в мощности и удобочитаемости.Я не думаю, что этот пример из учебника был сделан специально для того, чтобы продемонстрировать преимущества понимания списков, но просто попробуйте написать что-то вроде этого лоха с картой / фильтром:

[i for (i,c) in enumerate('abcdefghijklmnopqrstuvwxyz') if c in 'aeiou']

Вот лучшее, что я могупридумать:

map(lambda (i, c): i, filter(lambda (i,c): c in 'aeiou',
    enumerate('abcdefghijklmnopqrstuvwxyz')))
0 голосов
/ 08 сентября 2011

В вашем примере это не карта, которая обеспечивает гибкость, это конструкция определения функции.Вы также можете использовать эту функцию в понимании списка, но это не нужно.

0 голосов
/ 08 сентября 2011

Как и предполагал С. Лотт, понимание списка может сделать больше, чем map.Вам нужно и itertools.imap, и itertools.ifilter, чтобы охватить то, что можно сделать с пониманием.

[ str(round(355/113.0, i)) for i in range(1,12) if prime(i) ]

- это то же самое, что и

import itertools
list(
   itertools.imap(
      lambda x: str(round(355/113.0, x)), 
      itertools.ifilter(
         prime,
         range(1,12))))
...