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条经验 获得超12个赞
您可以利用可变列表
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条经验 获得超3个赞
for i in range(len(ls)):
if ls[i] is None:
ls[i] = ls[i-1]
如果它是 None,则将其设置为前一个变量。
添加回答
举报