在矩阵中的所有偶数列上返回max元素的函数

时间:2016-11-08 04:16:41

标签: python python-3.x matrix

如何编写一个函数,该函数返回矩阵1的偶数列中的所有数字中的最大元素,即第0,第2,第4等列中所有元素中的最大元素。前提条件:matrix1是一个矩阵,其中包含至少有1行和1列的数字。

预期结果如下:

 >>> maximum_among_all_even_columns([[1,1,1,1,1,1,1],[1,10,3,20,12,6,0]])
 12

这是我尝试过的尝试:

 ncols=len(m[0])
 nrows=len(m)
 sums=[]
 for j in range(ncols):
      col_sum=0
      for i in range(nrows):
           if i==0 or i%2 == 0:
                sums.append(m[i][j])
 maxf= max(sums)
 return maxf

3 个答案:

答案 0 :(得分:2)

l = [[1,1,1,1,1,1,1],[1,10,3,20,12,6,0]]
print max( sum(  map(list, zip(*l)[::2]) , []) )

注意:这只能在Python 2.x

中运行

说明

我按照以下方式构建了这个:

  1. zip(*l)
    
    • 创建以列为单位绑定元素的元组:[(1, 1), (1, 10), (1, 3), (1, 20), (1, 12), (1, 6), (1, 0)]
  2. zip(*l)[::2]
    
    • 在列表中采取了甚至步骤:[(1, 1), (1, 3), (1, 12), (1, 0)]
  3. map( list,zip(*l)[::2] )
    
    • 将上述元组转换为列表(因为我们可以修改列表):[[1, 1], [1, 3], [1, 12], [1, 0]]
  4. sum(  map(list, zip(*l)[::2]) , [])
    
    • 将所有内部列表加入单个列表:[1, 1, 1, 3, 1, 12, 1, 0]
  5. 最后

    max( sum(  map(list, zip(*l)[::2]) , []) )
    
    • 该列表的最高价值:12

答案 1 :(得分:2)

如果要返回偶数列的最大值:

import random
n = 10
m = 10
matrix = [[random.randint(0,100) for i in range(n)] for j in range(m)]

溶胶。 1:

%%timeit
max([element for row in matrix for col, element in enumerate(row) if col%2 == 0])

10000次循环,最佳3:每循环19.3μs

溶胶。 2:

%%timeit
res = max([row[i] for row in matrix for i in range(0,len(row),2)])

100000次循环,最佳3:每循环7.91μs

溶胶。 3:

%%timeit
res = max([element for row in matrix for element in row[::2]])

100000次循环,最佳3:每循环4.92μs

溶胶。 4:

%%timeit
res = matrix[0][0]
for j in range(len(matrix[0])//2):
     for i in range(len(matrix)):
         if matrix[i][2*j] > res:
             res = matrix[i][2*j]

100000个循环,最佳3:每个循环8.28μs

溶胶。 5:

%%timeit
max([max(e) for e in [col for col in  zip(*matrix)][::2]])

100000个循环,最佳3:每循环4.48μs

解决方案5(使用zip())略胜一筹。
测试双Intel(R)Xeon(R)CPU E5-2630 v3 @ 2.40GHz(32核)和Python 3.5.2 :: Anaconda自定义(64位)

<强>更新
添加时间......

更新2
解决方案切片。

更新3 我添加了一些代码来生成矩阵,将zip()解决方案'翻译'到Python3并使用矩阵10 * 10测试解决方案。我把所有的解决方案放在一起。

答案 2 :(得分:1)

这很简单,我认为不需要太多解释。 困难可能是我们习惯于在线上迭代然后在列上进行迭代,但在这里它是相反的。

https://graph.microsoft.com/v1.0/me/drive/sharedWithMe?$filter=remoteItem/createdBy/user/displayName eq '{DISPLAY_NAME}'

编辑:maxValue = matrix[0][0] for j in range(len(matrix[0])//2) : for i in range(len(matrix)) : if matrix[i][2*j] > maxValue : maxValue = matrix[i][2*j] 更改为max,以便不会覆盖maxValue内置函数。