У меня есть следующий список:
list = [[0, 0, 1],
[1, 0, 0],
[0, 1, 0]]
Моя цель — вернуть из этого списка набор кортежей, содержащих координаты (строку, столбец) каждого значения, равного 1.
Правильный ответ на приведенный выше код:
{(0, 2), (1, 0), (2, 1)}
Я работаю над своими знаниями по пониманию списков. Мне удается сделать это с помощью цикла for и индекса, но мне нужен более чистый код. Если решение может использовать понимание списка, я был бы признателен.






Очевидно, что вам нужно понимание множества , а не понимание списка (синтаксис тот же):
my_list = [
[0, 0, 1],
[1, 0, 0],
[0, 1, 0]
]
coordinates = {
(row, column)
for row in range(len(my_list))
for column in range(len(my_list[row]))
if my_list[row][column] == 1
}
print(coordinates)
Это должно напечатать:
{(1, 0), (0, 2), (2, 1)}
list = [[0, 0, 1],
[1, 0, 0],
[0, 1, 0]]
result = {(row_idx, col_idx) for row_idx, row in enumerate(list) for col_idx, value in enumerate(row) if value == 1}
print(result)
Вы можете рассмотреть возможность использования numpy для таких задач. По сути, это функция argwhere numpy:
>>> my_list = [[0, 0, 1],
... [1, 0, 0],
... [0, 1, 0]]
>>> A = np.array(my_list)
>>> np.argwhere(A)
array([[0, 2],
[1, 0],
[2, 1]])
(Семантически) Прямо: numpy.nonzero . Однако по сравнению с ответом wim ненулевой требуется еще один шаг, поскольку он возвращает строки и столбцы в их собственном подсписке, и его необходимо транспонировать, чтобы иметь отдельные пары, как вы хотите.
np.transpose(np.nonzero(my_list))
вы можете попробовать эту функцию, в которой вы можете передать значение, и она даст вам все координаты. Я использую понимание списка.
def find_coordinates(my_list, value):
return {(row, col) for row, sub_list in enumerate(my_list) for col, val in enumerate(sub_list) if val == value}
# Example usage:
my_list = [[0, 0, 1],
[1, 0, 0],
[0, 1, 0]]
value = 1
coordinates = find_coordinates(my_list, value)
Выход:
{(1, 0), (0, 2), (2, 1)}