Python内置函数map和filter的使用问题

刚开始学。在做一道练习题 题目是:

已知一个列表[1,2,3,4,5],将列表中每个元素都加1,并筛选出不能被2整除的数。

我的做法是:

因为查阅了相关资料。得知map函数返回的是一个object类型,所以在filter对上一个map的结果时采用了list()来转换。

a_list = [1, 2, 3, 4, 5]
b_list = map(lambda x: x + 1, a_list)
print(list(b_list))
c_list = filter(lambda x: x % 2, list(b_list))
print(list(c_list))

可是控制台的输出是:

[2, 3, 4, 5, 6]
[]

经过多次尝试发现只有这样才能成功输出:

a_list = [1, 2, 3, 4, 5]
b_list = map(lambda x: x + 1, a_list)
print(list(b_list))
c_list = filter(lambda x: x % 2, map(lambda x: x + 1, a_list))
print(list(c_list))

这样控制台的输出是:

[2, 3, 4, 5, 6]
[3, 5]

是正确的。

我单独对b_list做遍历输出也好,用list()转换后输出也好,输出的内容都是空。
只有第一句

print(list(b_list))

才能输出值

这是为什么呢。为什么第二次print(list(b_list))为空?
怎样才能让b_list的值一直存在?

阅读 2.4k
1 个回答

这样做就好了:

b_list = list(map(lambda x: x + 1, a_list))

在 Python 3+, 很多迭代过程在迭代时,会返回迭代对象自身, 这样不用保存完整的列表,多数情况下可以节省内存的提高速度.

>>> b_list = map(lambda x: x + 1, a_list)
>>> print(b_list)
<map object at 0x7ff89514cac8>

map返回的是迭代对象, 这个迭代器只能迭代一次(list(b_list)),迭代完成就完了. 第二次list(b_list)执行返回的是空. 但如果你把结果做为list放到内存里, 就没有这个问题了,只是如果list很大的话,内存占用多,效率会下降,好的做是把这些操作串在一起, 一次完成.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题