为什么Python教程说列表推导比map()更灵活?

时间:2011-09-08 13:35:45

标签: python list-comprehension

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 个答案:

答案 0 :(得分:6)

列表推导可以包含嵌套循环和条件:

nonzeros = [val for y in rows
                for val in y.cols
                if val != 0]

答案 1 :(得分:6)

区别相对小,但您必须编写一个包含名称的完整deflambda来使用map的非平凡表达式,而你可以去列表理解中使用它们。此外,列表推导包括过滤,而您需要单独filter调用(效率低下,并且parens快速增长超出可以轻松管理的范围)。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

map要求您定义my_round,而LC不要。

没有人说差异很大; - )

答案 4 :(得分:0)

正如S.Lott暗示的那样,列表理解可以做的不仅仅是map。您需要同时itertools.imapitertools.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))))

答案 5 :(得分:0)

对于您的示例,它不是提供灵活性的map,而是函数定义构造。您也可以在列表推导中使用该功能,但不需要。

答案 6 :(得分:0)

正如其他人所说,差异是微妙的,但有些情况下,列表理解在权力和可读性方面具有明显的优势。我不认为本教程中的示例是为了展示列表推导的优点而量身定制的,但只是尝试使用map / filter编写类似这个sucker的东西:

[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')))