• Python获取列表list中的非零数据、第一个非零元素、最后一个非零元素


    ​ 有时候,会有这种小需求,但是又不想遍历一遍list(太蠢了,写出这种代码,都不好意思把代码给别人看了😹),因此我们需要一种简单便捷,看起来像这么回事的一行代码来解决问题。

    资源分配图

    ​ 废话不多说,直接上代码。

    import numpy as np
    
    list = [[1, 0, 0], [0, 5, 0], [0, 0, 9]]
    list = np.array(list)
    print(list.ravel()[np.flatnonzero(list)].tolist())
    # 执行结果
    [1, 5, 9]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7


    想要深入理解的继续向下看。首先看下numpy提供的两个函数:

    import numpy as np
    
    list = [[1, 0, 0],
            [0, 5, 0],
            [0, 0, 9]]
    print(np.nonzero(list))
    print(np.flatnonzero(list))
    
    # 执行结果
    (array([0, 1, 2]), array([0, 1, 2]))
    [0 4 8]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    ​ 可以看到nonzero()函数会将多维数组中的非零元素的索引进行返回,并且返回结果的纬度和数组的纬度相同。flatnonzero()函数是将多维数组按照行优先排列的方式转成一维数组并返回其中非零元素的索引

    ​ 下面我们在来看一个函数:

    list = np.array([[1, 0, 0],
                     [0, 5, 0],
                     [0, 0, 9]])
    print(list.ravel())
    
    # 执行结果
    [1 0 0 0 5 0 0 0 9]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    ​ ravel()函数是numpy提供的,其功能为将一个多维数组以行优排列转为一维数组。

    ​ 哦,是不是很类似,我们可以将ravel()、flatnonzero()两个函数相结合,来实现我们的需求。代码如下:

    import numpy as np
    
    list = [[1, 0, 0],
            [0, 5, 0],
            [0, 0, 9]]
    list = np.array(list)
    print(list.ravel()[np.flatnonzero(list)])
    print(list.ravel()[np.flatnonzero(list)].tolist())
    
    
    # 执行结果
    [1 5 9]
    [1, 5, 9]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    ​ 最后,我们将ravel()、flatnonzero()两个函数结合取得的结果转成list,就得到了我们想要的结果。

    ​ 美中不足的是,ravel()函数是mumpy提供的函数,需要先将list转为array。并且即使list本身是一维数组,不需要转换成一维数组,但是list本身是无法直接获取多个非连续索引的值,因此只能借助array了。

    ​ 因此如果你想获取第一个、最后一个、或者指定顺序的单个非零元素的话,可以无需转成array,代码如下:

    list = [0, 1, 0, 0, 3, 0, 0, 5]
    
    # 获取第一个非0元素
    print(list[np.flatnonzero(list2)[0]])
    # 获取倒数第一个非0元素
    print(list[np.flatnonzero(list2)[-1]])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    ​ 当然这种用法要注意数组越界问题,需提前验证list中存在非零元素。

  • 相关阅读:
    使用C#实现服务端与客户端的简陋聊天
    网络靶场实战-物联网安全qiling框架初探
    每天5分钟复习OpenStack(八)存储虚拟化
    互联网摸鱼日报(2022-11-12)
    【linux】(1)文件操作及vi
    HttpServletResponse对象
    如何在启用Secure Boot的Ubuntu 22.04电脑中安装使用VirtualBox 6.1
    程序员都看不懂的代码
    大数据分析:使用Spark和Hadoop的实用指南
    (54)性能分析命令
  • 原文地址:https://blog.csdn.net/qq_34666857/article/details/126022142