【问题标题】:How to loop through a column in Python?如何遍历Python中的列?
【发布时间】:2016-03-26 23:37:15
【问题描述】:

已经看到了有关此问题的答案,但没有人帮助我。有些人使用 numpy,有些人使用其他有助于 Python 更简单的平台回答。我不想要这些类型的东西,我想要简单的 Python,而不需要导入库或其他任何东西。

假设:我想做一个方法来检查二维数组中是否至少有一列具有相同的值。 例如:

arr = [[2,0,3],[4,2,3],[1,0,3]]

arr 发送到我的方法将返回True,因为在第三列中每个术语都有数字3。

我将如何编写此方法?如何循环遍历二维数组中的每一列?

【问题讨论】:

  • 你必须编写一个循环遍历行的算法。

标签: python loops multidimensional-array


【解决方案1】:

遍历列

如何循环遍历二维数组中的每一列?

为了遍历每一列,只需遍历转置矩阵(a transposed matrix is just a new matrix where the rows of original matrix are now columns and vice-versa)

# zip(*matrix) generates a transposed version of your matrix
for column in zip(*matrix): 
    do_something(column)

对您提出的问题/示例的回答

我想做一个方法来检查是否至少有一列 在二维数组中该列具有相同的值

一般方法:

def check(matrix):
    for column in zip(*matrix):
        if column[1:] == column[:-1]:
            return True
    return False

单线:

arr = [[2,0,3],[4,2,3],[1,0,3]]
any([x[1:] == x[:-1] for x in zip(*arr)])

解释:

arr = [[2,0,3],[4,2,3],[1,0,3]]
# transpose the matrix
transposed = zip(*arr) # transposed = [(2, 4, 1), (0, 2, 0), (3, 3, 3)]
# x[1:] == x[:-1] is a trick.
# It checks if the subarrays {one of them by removing the first element (x[1:])
# and the other one by removing the last element (x[:-1])} are equals.
# They will be identical if all the elements are equal. 
equals = [x[1:] == x[:-1] for x in transposed] # equals = [False, False, True]
# verify if at least one element of 'equals' is True
any(equals) # True

更新 01

@BenC 写道:

"您也可以跳过列表推导周围的 [],以便任何 只是得到一个可以提前停止一次的生成器/如果它返回 假”

所以:

arr = [[2,0,3],[4,2,3],[1,0,3]]
any(x[1:] == x[:-1] for x in zip(*arr))

更新 02

您也可以使用集合(与@HelloV 的答案合并)。

单线:

arr = [[2,0,3],[4,2,3],[1,0,3]]
any(len(set(x))==1 for x in zip(*arr))

一般方法:

def check(matrix):
    for column in zip(*matrix):
        if len(set(column)) == 1:
            return True
    return False

一个集合没有重复的元素,所以如果你将一个列表转换成一个集合set(x),任何重复的元素都会消失,所以,如果所有元素都相等,那么结果集合的长度等于一个len(set(x))==1

【讨论】:

  • 您也可以跳过列表理解周围的[],以便any 获得一个可以提前停止的生成器/如果它返回false。
【解决方案2】:

一个简单的例子,没有增加列表推导的复杂性和 zip 函数如下:

arr = [[2,0,3],[4,2,3],[1,0,2]]

def check_column_equals_index(colum):
    for row in arr:
        if row[colum-1] != colum:
            return False
    return True

print check_column_equals_index(3)

如果每行的第 3 列等于 3,则输出 True。

尽管如此,正如您可能在其他一些相关讨论中读到的那样,使用NumpyPandas 可能值得考虑。

【讨论】:

  • 这里是把数组列发送给方法吗?我想循环一个二维数组,而不需要把它放在一个变量上。
  • 该方法只是为了向您展示如何定义使用二维数组的函数。您不一定要为它编写函数,但这可能是个好主意。示例中的 column 参数就是您要检查的列号。在您的问题中,您解释了第 3 列的示例,它必须是 3。这就是您可以这样做的方法。为了检查所有列,您还必须使用附加的for column in row: 语句遍历列。或者您可以使用@iuridiniz 描述的更高级的方法
【解决方案3】:
1 in [len(set(i)) for i in zip(*arr)]

【讨论】:

  • 你可以只使用:any(len(set(i))==1 for i in zip(*arr))
【解决方案4】:

遍历二维列表中的列并且没有导入?如何将列元素提取到辅助列表,然后相互比较。您可以在此概要功能中控制流程:

def checkcolumn(colnum, arrex=[]):
    for i in range(len(arr)):
        arrex.append(arr[i][colnum])

    if arrex.count(arrex[0]) == len(arrex):
        return True
    else:
        return False

print checkcolumn(1) 

对我来说似乎最简单且非常具有指导意义。其他比较列中元素的方法可以在以下位置找到: https://www.csestack.org/python-check-if-all-elements-in-list-are-same/

【讨论】:

    【解决方案5】:

    我来这里是为了查看这些解决方案,但我觉得它并没有真正回答问题——如果没有 Python 中的一些库,如何循环遍历列?我假设您的意思是按列循环(如从左到右查看二维矩阵)。

    在二维数组中,遍历每个索引意味着查看具有自己内部数组的新行。

    如果你在这个内部数组循环上创建一个循环,那么每次你从外部数组遍历一个内部数组时——你可以用当前外部数组索引(本质上是一列)查看内部数组。

    内部循环将遍历“列”直到完成,然后外部循环递增到下一个索引,再次使用内部循环访问该索引处的所有列直到完成;以此类推——直到外循环也完成。

    注意:您需要跟踪外部循环访问的列数,一种方法是获取二维数组中第一个内部数组的长度,并假设所有后续内部数组都有相同的长度。所以这个解决方案可以解决你的问题,因为你所有的内部数组都有相同的长度。

    代码示例:

    arr = [[2,0,3],[4,2,3],[1,0,3]]
    # assumes that all other inner rows visited will be same length.
    rowsize = len(arr[0]) 
    
    for i in range(0, len(rowsize)):
      for row in arr:
        print(row[i])
    

    预期输出:

    2
    4
    1
    0
    2
    0
    3
    3
    3
    

    请随意修改它以适合您的测试方法。应该很容易检查 3 是否再次出现在同一列中。

    【讨论】:

      猜你喜欢
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 2012-07-07
      • 2015-08-07
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多