6 回答

TA貢獻1812條經驗 獲得超5個贊
在 Python 3.8 或更高版本中,您可以使用賦值運算符來執行此操作:
def?none_replace(ls): ????p?=?None ????return?[p:=e?if?e?is?not?None?else?p?for?e?in?ls]

TA貢獻1842條經驗 獲得超13個贊
您可以利用可變列表
x =[None, None, 1, 2, None, None, 3, 4, None, 5, None, None]
for i,e in enumerate(x[:-1], 1):
if x[i] is None:
x[i] = x[i-1]
print(x)
輸出
[None, None, 1, 2, 2, 2, 3, 4, 4, 5, 5, 5]

TA貢獻1848條經驗 獲得超6個贊
您可以使用該函數accumulate()和運算符or:
from itertools import accumulate
list(accumulate(lst, lambda x, y: y or x))
# [None, None, 1, 2, 2, 2, 3, 4, 4, 5, 5, 5]
在此解決方案中,您獲取該元素y和前一個元素x,并使用運算符對它們進行比較or。如果y是None則取前一個元素x;否則,你就拿y。如果兩者都是None你得到的None。

TA貢獻1829條經驗 獲得超4個贊
類似于我們一位朋友的解決方案。為了可讀性稍作修改。使用 range(len()) 代替枚舉
x =[None, None, 1, 2, None, None, 3, 4, None, 5, None, None]
for i in range(len(x)):
if x[i] is None:
x[i] = x[i-1]
print(x)
輸出: [None, None, 1, 2, 2, 2, 3, 4, 4, 5, 5, 5]
為第一個值 x[-1] 賦值None。所以執行程序時沒有錯誤...
反饋總是值得贊賞..:)

TA貢獻2003條經驗 獲得超2個贊
有什么方法可以在一行中完成此操作嗎?即列表理解、Lambda 和/或映射
我不這么認為,因為綁定關閉很晚。此外,它可能不可讀。
我的項目中有一個類似的場景以這種方式處理 None ,問題是我不想為小功能編寫 10 行代碼。
為什么你覺得它很???問題就是需要解決的問題。一個小函數聽起來是解決這個問題的一個不錯的選擇。
我的解決方法:
def none_replace(ls: list):
prev, this = ls[0], None
assert prev is not None, "First arg can't be None"
for i in range(1, len(ls)):
this = ls[i]
if this is None:
ls[i] = prev
prev = this or ls[i]
return ls
print('Replaced None List:', none_replace(['asd', None, None, 1, 2, None, None, 3, 4, None, 5, None, None]))

TA貢獻1872條經驗 獲得超4個贊
for i in range(len(ls)):
if ls[i] is None:
ls[i] = ls[i-1]
如果它是 None,則將其設置為前一個變量。
添加回答
舉報