I have seen answers about this question but no one helped me. Some used numpy, and some people answered using other platforms that help Python to be simpler. I don't want these type of things, I want with the simple Python without importing libraries or anything more.
Let's say: I would want to do a method that checks if there's at least one column in the 2D array that the column has the same values.
For example:
arr = [[2,0,3],[4,2,3],[1,0,3]]
Sending arr to my method would return True because in the third column there is in each term the number 3.
How would I write this method? How do I loop through each column in the 2D array?
解决方案
Loop through column
How do I loop through each column in the 2D array?
# zip(*matrix) generates a transposed version of your matrix
for column in zip(*matrix):
do_something(column)
An answer to your proposed problem/example
I would want to do a method that checks if there's at least one column
in the 2D array that the column has the same values
General method:
def check(matrix):
for column in zip(*matrix):
if column[1:] == column[:-1]:
return True
return False
One-liner:
arr = [[2,0,3],[4,2,3],[1,0,3]]
any([x[1:] == x[:-1] for x in zip(*arr)])
Explanation:
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
Update 01
@BenC wrote:
"You could also skip the [] around the list comprehension so that any
just gets a generator that can be stopped early once/if it returns
false"
so:
arr = [[2,0,3],[4,2,3],[1,0,3]]
any(x[1:] == x[:-1] for x in zip(*arr))
Update 02
You could also use sets (merged with the answer of @HelloV).
One-liner:
arr = [[2,0,3],[4,2,3],[1,0,3]]
any(len(set(x))==1 for x in zip(*arr))
General method:
def check(matrix):
for column in zip(*matrix):
if len(set(column)) == 1:
return True
return False
A set does not have repeated elements, so if you transform a list into a set set(x) any duplicated element goes away, so, if all elements are equals, the lenght of resulting set is equal to one len(set(x))==1.