我看到了关于这个问题的答案,但是没有一个能够帮助我。有些人使用了numpy,有些人使用其他可以使Python更简单的平台来回答。我不想要这些东西,我只想使用简单的Python而不需要导入任何库或其他东西。
假设现在有一个二维数组,我想写一个方法来检查是否至少存在一列的元素值都相同。例如:
arr = [[2,0,3],[4,2,3],[1,0,3]]
将arr
发送到我的方法将返回True
,因为每个术语的第三列都有数字3。我该如何编写这个方法?如何遍历2D数组中的每一列?
我看到了关于这个问题的答案,但是没有一个能够帮助我。有些人使用了numpy,有些人使用其他可以使Python更简单的平台来回答。我不想要这些东西,我只想使用简单的Python而不需要导入任何库或其他东西。
假设现在有一个二维数组,我想写一个方法来检查是否至少存在一列的元素值都相同。例如:
arr = [[2,0,3],[4,2,3],[1,0,3]]
将arr
发送到我的方法将返回True
,因为每个术语的第三列都有数字3。如何遍历二维数组中的每一列?
为了遍历每一列,只需遍历转置矩阵(转置矩阵是一个新的矩阵,原始矩阵的行现在变成了列,反之亦然)。
# 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
@BenC 写道:
“你也可以跳过列表推导式周围的[],这样任何just都会得到一个生成器,如果它返回false就可以提前停止了。”
因此:
arr = [[2,0,3],[4,2,3],[1,0,3]]
any(x[1:] == x[:-1] for x in zip(*arr))
你还可以使用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
。
[]
,这样any
函数会获取一个生成器,一旦生成器返回false,就可以提前停止。 - BenCfor column in row:
语句迭代列。或者您可以使用@iuridiniz描述的更高级的方法。 - DJanssens1 in [len(set(i)) for i in zip(*arr)]
any(len(set(i))==1 for i in zip(*arr))
- iuridiniz如何在没有导入任何库的情况下循环遍历二维列表中的一列?将列元素提取到辅助列表中,然后进行比较如何?您可以使用此综合函数控制过程:
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/
我来这里看这些解决方案,但感觉它并没有真正回答问题——如何在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。