1380. 矩阵中的幸运数 (zip和*解包)

简介: 1380. 矩阵中的幸运数 (zip和*解包)

给你一个 m * n 的矩阵,矩阵中的数字 各不相同 。请你按 任意 顺序返回矩阵中的所有幸运数。

幸运数是指矩阵中满足同时下列两个条件的元素:

  • 在同一行的所有元素中最小
  • 在同一列的所有元素中最大

解:

1.求出每行最小元素rowmin和每列最大元素colmax

然后遍历matrix,如果同时满足rowmin和colmax,则是幸运数。

class Solution:
    def luckyNumbers (self, matrix: List[List[int]]) -> List[int]:
        
        rows,cols  = len(matrix), len(matrix[0])
        rowmin = [matrix[i][0] for i in range(rows)]
        colmax = [matrix[0][j] for j in range(cols)]
 
        for i in range(rows):
            for j in range(cols):
                x = matrix[i][j]
                if x < rowmin[i] :
                    rowmin[i] = x
                if x  > colmax[j]:
                    colmax[j] = x
        #print(rowmin, colmax)
        
 
        return [matrix[i][j] for i in range(rows) for j in range(cols) if matrix[i][j]==rowmin[i] and matrix[i][j] == colmax[j]]

2.对1的改进,最后不需要遍历matrix,因为matrix中元素各不相同,只要求rowmin和colmax交集即可。

class Solution:
    def luckyNumbers (self, matrix: List[List[int]]) -> List[int]:
        
        rows,cols  = len(matrix), len(matrix[0])
        rowmin = [matrix[i][0] for i in range(rows)]
        colmax = [matrix[0][j] for j in range(cols)]
 
        for i in range(rows):
            for j in range(cols):
                x = matrix[i][j]
                if x < rowmin[i] :
                    rowmin[i] = x
                if x  > colmax[j]:
                    colmax[j] = x
        #print(rowmin, colmax)
        
 
        return [x for x in rowmin if x in colmax ]

3.评论区的简单写法。

        rowmin = [min(i) for i in matrix]
        colmax = [max(i) for i in zip(*matrix)]
        return [i for i in rowmin if i in colmax]

zip(*iterables, strict=False)在多个迭代器上并行迭代,从每个迭代器返回一个数据项组成元组。

“不妨换一种方式认识 zip() :它会把行变成列,把列变成行。这类似于 矩阵转置 ”

*在这里是列表解包操作。

使用zip 和* 可实现拆解列表。

>>> x = [1, 2, 3]

>>> y = [4, 5, 6]

>>> list(zip(x, y))

[(1, 4), (2, 5), (3, 6)]

>>> x2, y2 = zip(*zip(x, y))

>>> x == list(x2) and y == list(y2)

True

矩阵转置:martrix是一个二维矩阵,如下操作可以得到它的转置。

list(zip(*matrix))

4. 其他流程控制工具 — Python 3.10.2 文档

解包:

* 操作符把实参从列表或元组解包出来

list(range(3, 6))            # normal call with separate arguments


args = [3, 6]

list(range(*args))            # call with arguments unpacked from a

list*args 将列表[3, 6] 解包为单独的参数 3 和6

#如果args = [[1,2],[3,4]] 这样的嵌套列表,*args会解包成[1,2]  和[3,4] 也就是解一层。

**字典解包,将字典解为关键字参数。

def parrot(voltage, state='a stiff', action='voom'):

   print("-- This parrot wouldn't", action, end=' ')

   print("if you put", voltage, "volts through it.", end=' ')

   print("E's", state, "!")

d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}

parrot(**d)

-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !


相关文章
|
4月前
|
存储 Python
Python示例:分解一个不多于指定位的正整数
Python示例:分解一个不多于指定位的正整数
36 0
|
4月前
|
存储 Python
Python示例:分解一个不多于指定位的正整数
Python示例:分解一个不多于指定位的正整数
41 0
|
7月前
|
安全 Python 容器
Python中解包元素数量匹配
【6月更文挑战第21天】
60 2
|
6月前
|
Python
打印9*9乘法表(递归或压缩矩阵)python
打印9*9乘法表(递归或压缩矩阵)python
|
8月前
|
人工智能 算法 BI
【经典问题】给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?
【1月更文挑战第26天】【经典问题】给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?
|
8月前
|
Python Java Go
Python每日一练(20230420) 数组逐位判断、交错字符串、二进制求和
Python每日一练(20230420) 数组逐位判断、交错字符串、二进制求和
80 0
Python每日一练(20230420) 数组逐位判断、交错字符串、二进制求和
|
机器学习/深度学习 Python
Python批量读取Excel并跨越不同xlsx文件求取平均值
本文介绍基于Python语言,实现对多个不同Excel文件进行数据读取与平均值计算的方法~
243 1
Python批量读取Excel并跨越不同xlsx文件求取平均值
成信大ENVI_IDL第一周实验测试:数组的简单运算+详细解析
成信大ENVI_IDL第一周实验测试:数组的简单运算+详细解析
104 0
|
机器学习/深度学习 Python
Python应用专题 | 15:获取list中出现频数最多的元素
给定一个列表,找到其中最高频的元素?本文以代码的角度进行介绍。
|
Python
Python 字典的一个奇异现象
Python 字典的一个奇异现象