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?
In order to iterate over rows, we use iteritems() function this function iterates over each column as key, value pair with the label as key, and column value as a Series object.
To slice the columns, the syntax is df. loc[:,start:stop:step] ; where start is the name of the first column to take, stop is the name of the last column to take, and step as the number of indices to advance after each extraction; for example, you can select alternate columns.
How do I loop through each column in the 2D array?
In order to loop through each column just loop through the transposed matrix (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)
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
@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))
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
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With