在Python Tutorial中,它说:
为什么呢?我不认为理解是如何“更灵活”的。在我看来,只是语法上的差异。我很容易做到:
def my_round(i):
return str(round(355/113.0, i))
a = map(my_round, range(1, 6))
我不知道map()
在这里缺乏灵活性。
任何人都可以详细说明吗?
答案 0 :(得分:6)
列表推导可以包含嵌套循环和条件:
nonzeros = [val for y in rows
for val in y.cols
if val != 0]
答案 1 :(得分:6)
区别相对小,但您必须编写一个包含名称的完整def
或lambda
来使用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.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))))
答案 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')))