鍍金池/ 問答/Python/ Python內(nèi)置函數(shù)map和filter的使用問題

Python內(nèi)置函數(shù)map和filter的使用問題

剛開始學(xué)。在做一道練習(xí)題 題目是:

已知一個(gè)列表[1,2,3,4,5],將列表中每個(gè)元素都加1,并篩選出不能被2整除的數(shù)。

我的做法是:

因?yàn)椴殚喠讼嚓P(guān)資料。得知map函數(shù)返回的是一個(gè)object類型,所以在filter對上一個(gè)map的結(jié)果時(shí)采用了list()來轉(zhuǎn)換。

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]
[]

經(jīng)過多次嘗試發(fā)現(xiàn)只有這樣才能成功輸出:

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]

是正確的。

我單獨(dú)對b_list做遍歷輸出也好,用list()轉(zhuǎn)換后輸出也好,輸出的內(nèi)容都是空。
只有第一句

print(list(b_list))

才能輸出值

這是為什么呢。為什么第二次print(list(b_list))為空?
怎樣才能讓b_list的值一直存在?

回答
編輯回答
拼未來

這樣做就好了:

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

在 Python 3+, 很多迭代過程在迭代時(shí),會返回迭代對象自身, 這樣不用保存完整的列表,多數(shù)情況下可以節(jié)省內(nèi)存的提高速度.

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

map返回的是迭代對象, 這個(gè)迭代器只能迭代一次(list(b_list)),迭代完成就完了. 第二次list(b_list)執(zhí)行返回的是空. 但如果你把結(jié)果做為list放到內(nèi)存里, 就沒有這個(gè)問題了,只是如果list很大的話,內(nèi)存占用多,效率會下降,好的做是把這些操作串在一起, 一次完成.

2018年7月5日 07:31