Вопрос:

Как перебрать столбец в Python?

python loops multidimensional-array

7232 просмотра

4 ответа

28 Репутация автора

Я уже видел ответы по этому вопросу , но никто не помог мне. Некоторые использовали numpy , а некоторые отвечали, используя другие платформы, которые помогают Python быть проще. Я не хочу такого рода вещей, я хочу с простым Python без импорта библиотек или чего-то еще.

Скажем так: я хотел бы сделать метод, который проверяет, есть ли хотя бы один столбец в двумерном массиве, что столбец имеет те же значения. Например:

arr = [[2,0,3],[4,2,3],[1,0,3]]

Отправка arrв мой метод будет возвращаться, Trueпотому что в третьем столбце каждого термина есть число 3.

Как бы я написал этот метод? Как мне пройти по каждому столбцу в двумерном массиве?

Автор: user139316 Источник Размещён: 20.12.2015 10:17

Ответы (4)


6 плюса

1163 Репутация автора

Проход по колонке

Как мне пройти по каждому столбцу в двумерном массиве?

Для того, чтобы пройти через каждый столбец, просто выполните цикл по транспонированной матрице (транспонированная матрица - это просто новая матрица, где строки исходной матрицы теперь являются столбцами и наоборот) .

# 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

Обновление 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.

Автор: iuridiniz Размещён: 20.12.2015 10:23

0 плюса

5451 Репутация автора

Простой пример, без добавления сложностей со списками и функцией 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)

который выведет True, если 3-й столбец равен 3 для каждой строки.

Тем не менее, как вы, возможно, читали в некоторых других связанных обсуждениях, возможно, стоит подумать об использовании Numpy или Pandas .

Автор: DJanssens Размещён: 20.12.2015 10:26

0 плюса

32174 Репутация автора

1 in [len(set(i)) for i in zip(*arr)]
Автор: helloV Размещён: 20.12.2015 10:26

0 плюса

11 Репутация автора

Прокручивать столбец в 2D списке и не импортировать? Как насчет извлечения элементов столбцов во вспомогательный список, а затем сравнить их между собой. Вы можете контролировать процесс в этой синоптической функции:

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/

Автор: Johny English Размещён: 13.06.2019 04:29
Вопросы из категории :
32x32