對生成器表示式及列表表示式使用zip的注意事項

2021-10-04 10:21:38 字數 1176 閱讀 4974

在python資料處理中,zip和列表表示式(list comprehensions)都是常用的操作。但當兩者結合在一起時,若對zip函式不熟悉則容易出錯:

array_list = [np.arange(10),np.arange(10)]

zip_comp = zip(a for a in array_list)

zip_loc = zip(array_list[0],array_list[1])

print('列表表示式的錯誤結果')

for z in zip_comp:

print(z)

print('-------------------')

print('預期結果')

for z in zip_loc:

print(z)

列表表示式的錯誤結果

(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),)

(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),)

-------------------

預期結果

(0, 0)

(1, 1)

(2, 2)

(3, 3)

(4, 4)

(5, 5)

(6, 6)

(7, 7)

(8, 8)

(9, 9)

這是因為zip(x,y)中待合併的iterable應當在不同引數位置,若直接將列表表示式或生成器表示式放入zip,則zip中只有乙個iterable元素,即zip(iter),結果只能返回iter本身。

將生成器表示式或列表表示式作為可變引數*arg放入zip

zip_correct = zip(*(a for a in array_list))

print('正確結果')

for z in zip_correct:

print(z)

正確結果

(0, 0)

(1, 1)

(2, 2)

(3, 3)

(4, 4)

(5, 5)

(6, 6)

(7, 7)

(8, 8)

(9, 9)

生成器表示式

生成器 生成器本質是迭代器,允許自定義邏輯的迭代器 迭代器和生成器區別 迭代器本身是系統內建的.重寫不了.而生成器是使用者自定義的,可以重寫迭代邏輯 生成器可以用兩種方式建立 1 生成器表示式 裡面是推導式,外面用圓括號 2 生成器函式 用def定義,裡面含有yield 1 生成器表示式 gener...

生成器 表示式

1.什麼是生成器?生成的工具。生成器是乙個 自定義 的迭代器,本質上是乙個迭代器。2.如何實現生成器但凡在函式內部定義了的yield,呼叫函式時,函式體 不會執行,會返回乙個結果,該結果就是乙個生成器。yield 每一次yield都會往生成器物件中新增乙個值。yield只能在函式內部定義 yield...

生成器表示式

把列表推導式的換成 就是生成器表示式 示例 把生一筐雞蛋變成給你乙隻老母雞,這也是生成器的特性 chicken 雞蛋 s item for item in range 10 print chicken 生成器物件記憶體位址 print next chicken 雞蛋0 print next chic...