如何遍历Python中的列?

Posted

技术标签:

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

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

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

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

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

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

【问题讨论】:

你必须编写一个循环遍历行的算法。 【参考方案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。

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

【讨论】:

这里是把数组列发送给方法吗?我想循环一个二维数组,而不需要把它放在一个变量上。 该方法只是为了向您展示如何定义使用二维数组的函数。您不一定要为它编写函数,但这可能是个好主意。示例中的 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 是否再次出现在同一列中。

【讨论】:

以上是关于如何遍历Python中的列?的主要内容,如果未能解决你的问题,请参考以下文章

如何遍历 spark 数据集并更新 Java 中的列值?

遍历 pyspark 数据框中的列,而不为单个列创建不同的数据框

遍历火花数据框中的列并计算最小值最大值

如果所有值都相同,则循环遍历 bash 测试中的列 - AWK

Python:从 CSV 文件中的列创建多个文本文件

python - 如何将qwidgettable中的列设置为python中的会计格式? [复制]