如何遍历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中的列?的主要内容,如果未能解决你的问题,请参考以下文章
遍历 pyspark 数据框中的列,而不为单个列创建不同的数据框