如何在Python中循环遍历一个列?

10

我看到了关于这个问题的答案,但是没有一个能够帮助我。有些人使用了numpy,有些人使用其他可以使Python更简单的平台来回答。我不想要这些东西,我只想使用简单的Python而不需要导入任何库或其他东西。

假设现在有一个二维数组,我想写一个方法来检查是否至少存在一列的元素值都相同。例如:

arr = [[2,0,3],[4,2,3],[1,0,3]]
arr发送到我的方法将返回True,因为每个术语的第三列都有数字3。
我该如何编写这个方法?如何遍历2D数组中的每一列?

你需要编写一个循环遍历行的算法。 - Lev Levitsky
5个回答

13

遍历列

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

为了遍历每一列,只需遍历转置矩阵(转置矩阵是一个新的矩阵,原始矩阵的行现在变成了列,反之亦然)

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

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

我想要编写一个方法,检查在2D数组中是否至少有一列具有相同的值。

通用方法:

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 写道:

“你也可以跳过列表推导式周围的[],这样任何just都会得到一个生成器,如果它返回false就可以提前停止了。”

因此:

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

更新02

你还可以使用set(与@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),任何重复的元素都会消失,因此,如果所有元素都相等,得到的集合长度等于1 len(set(x))==1


3
你也可以省略对列表推导式的[],这样any函数会获取一个生成器,一旦生成器返回false,就可以提前停止。 - BenC

0
一个简单的例子,不涉及列表推导式和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,则输出True。

然而,正如您可能在其他相关讨论中所读到的那样,考虑使用NumpyPandas可能是值得的。


你是否将数组列发送到了方法中?我想循环遍历一个二维数组而不需要先将其放在变量中。 - user139316
这个方法只是展示了如何定义一个使用二维数组的函数。你不一定需要为此编写一个函数,但这可能是一个好主意。在示例中,列参数只是您想要检查的列号。在您的问题中,您解释了需要为3的第三列的示例。这就是您可以做到这一点的方式。为了检查所有列,您还需要使用额外的for column in row:语句迭代列。或者您可以使用@iuridiniz描述的更高级的方法。 - DJanssens

0
1 in [len(set(i)) for i in zip(*arr)]

你可以使用以下代码:any(len(set(i))==1 for i in zip(*arr)) - iuridiniz

0

如何在没有导入任何库的情况下循环遍历二维列表中的一列?将列元素提取到辅助列表中,然后进行比较如何?您可以使用此综合函数控制过程:

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/


0

我来这里看这些解决方案,但感觉它并没有真正回答问题——如何在Python中不使用任何库循环列?我假设你的意思是按列循环(即从左到右查看二维矩阵)。

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

如果您在此内部数组循环上创建一个循环,则每次从外部数组遍历内部数组时,您都可以使用当前外部数组索引(实质上是列)查看内部数组。

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

注意:您需要跟踪要使用外部循环访问多少列,一种方法是获取2D数组中第一个内部数组的长度,并假设所有随后的内部数组具有相同的长度。因此,由于您所有的内部数组具有相同的长度,因此此解决方案适用于您的问题。

代码示例:

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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接