How to loop through a column in Python?

17,711

Loop through column

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)

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.

Share:
17,711
user139316
Author by

user139316

Updated on July 24, 2022

Comments

  • user139316
    user139316 almost 2 years

    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?

  • BenC
    BenC over 8 years
    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.
  • user139316
    user139316 over 8 years
    Here are you sending the array column to the method? I want to loop a 2D array without needing to put it on a variable before.
  • iuridiniz
    iuridiniz over 8 years
    you could use just: any(len(set(i))==1 for i in zip(*arr))
  • DJanssens
    DJanssens over 8 years
    The method is just to show you how a function can be defined that uses the 2D array. You do not necessarily write a function for it, but it might be a good idea. The column parameter in the example is just the column number that you want to check. In your question you explained the example of column 3, which needed to be 3. This is how you could do that. In order to check all columns, you will also have to iterate over the columns with an additional for column in row: statement. Or you might use the more advanced approach as described by @iuridiniz