2024-08-01|閱讀時間 ‧ 約 26 分鐘

[Python]生成器表達式過濾多層的列表中的空值

在處理數據時,最可能會遇到數據中含有None的時候,若沒有處理就進行運算就會造成程式崩潰或者報錯

數據中含有None

input_list = [(42, 292), (28, 296), (999, 92), (993, 46), (219, 4), (279, 2), (None, None), (None, None)]

本文將將介紹使用生成器表達式(generator expression)來過濾掉空值保留好的數據,也用其他方法來達到一樣的效果。


程式範例

生成器表達式(generator expression)

input_list = [(42, 292), (28, 296), (999, 92), (993, 46), (219, 4), (279, 2), (None, None), (None, None)]

# 使用生成器表達式來過濾掉包含 None 的座標
filtered_list = list((x, y) for x, y in input_list if x is not None and y is not None)

print(filtered_list) # 這會輸出 [(42, 292), (28, 296), (999, 92), (993, 46), (219, 4), (279, 2)]

生成器表達式

(x, y) for x, y in input_list if x is not None and y is not None

詳細步驟

for x, y in input_list
遍歷 input_list: 生成器表達式會依次取出 input_list 中的每一個二元組 (x, y)

input_list if x is not None and y is not None
過濾條件: 對於每一個二元組 (x, y),檢查 x 是否為 None 並且 y 是否為 None。如果 xy 都不是 None,則保留該二元組;否則,過濾掉該二元組。

轉換成列表list(...)。

以下用其他方法也可以做到過濾None的值

列表推導式(list comprehension)

input_list = [(42, 292), (28, 296), (999, 92), (993, 46), (219, 4), (279, 2), (None, None), (None, None)]

filtered_list = [(x, y) for x, y in input_list if x is not None and y is not None]

print(filtered_list) # 這會輸出 [(42, 292), (28, 296), (999, 92), (993, 46), (219, 4), (279, 2)]

使用 filter 函數過濾 None

input_list = [(42, 292), (28, 296), (999, 92), (993, 46), (219, 4), (279, 2), (None, None), (None, None)]

filtered_list = list(filter(lambda coord: coord[0] is not None and coord[1] is not None, input_list))

print(filtered_list) # 這會輸出 [(42, 292), (28, 296), (999, 92), (993, 46), (219, 4), (279, 2)]

使用 for 迴圈手動過濾 None

input_list = [(42, 292), (28, 296), (999, 92), (993, 46), (219, 4), (279, 2), (None, None), (None, None)]

filtered_list = []
for coord in input_list:
if coord[0] is not None and coord[1] is not None:
filtered_list.append(coord)

print(filtered_list) # 這會輸出 [(42, 292), (28, 296), (999, 92), (993, 46), (219, 4), (279, 2)]

這些方法都可以保留原本的非空值,並且過濾掉包含 None 的座標。你可以根據自己的需求選擇最適合的一種方法。


分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.