为了账号安全,请及时绑定邮箱和手机立即绑定

如何用以前的值替换列表中的 None

如何用以前的值替换列表中的 None

PIPIONE 2023-09-26 16:09:47
我想将None中的替换list为之前的变量(对于所有连续的 None )。if我用and for(多行)做到了。有什么方法可以在一行中完成此操作吗?即列表理解、Lambda 和/或映射我的想法是使用列表理解,但我无法在列表理解中分配变量来设置先前的值。我的项目中有一个类似的场景需要None以这种方式处理,问题是我不想为小功能编写 10 行代码。def none_replace(ls):    ret = []    prev_val = None    for i in ls:        if i:            prev_val = i            ret.append(i)        else:            ret.append(prev_val)    return retprint('Replaced None List:', none_replace([None, None, 1, 2, None, None, 3, 4, None, 5, None, None]))输出:Replaced None List: [None, None, 1, 2, 2, 2, 3, 4, 4, 5, 5, 5]
查看完整描述

6 回答

?
慕雪6442864

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]


查看完整回答
反对 回复 2023-09-26
?
红颜莎娜

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]


查看完整回答
反对 回复 2023-09-26
?
慕勒3428872

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。


查看完整回答
反对 回复 2023-09-26
?
浮云间

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。所以执行程序时没有错误...


反馈总是值得赞赏..:)


查看完整回答
反对 回复 2023-09-26
?
湖上湖

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



查看完整回答
反对 回复 2023-09-26
?
守着一只汪

TA贡献1872条经验 获得超3个赞

for i in range(len(ls)):

   if ls[i] is None:

     ls[i] = ls[i-1]

如果它是 None,则将其设置为前一个变量。


查看完整回答
反对 回复 2023-09-26
  • 6 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信