2013-11-16 5 views
-1

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

Как я могу сопоставить индексы в матрице с индексами в списке?

Thanx заранее.

+0

Вы говорите, что вы сплющили матрицу, то есть сделали это одномерным списком? В противном случае индексы одинаковы. (Также добавьте небольшой пример кортежа кортежей.) – syockit

+0

точно. Я превратил его в одномерное. – adamco

ответ

4

Со списком вы можете просто использовать оператор [] еще раз. Так, например:

>>> a = [[1,2], [3, 4]] 
>>> a[0][0] 
1 
>>> a[0][1] 
2 
>>> a[1][0] 
3 
>>> a[1][1] 
4 
>>> type(a) 
<type 'list'> 
>>> type(a[0]) 
<type 'list'> 
>>> type(a[0][0]) 
<type 'int'> 

Объяснение простое, в первый раз, вы используете оператор [], вы получите list, так что вы можете использовать оператор [] снова. Подобно этому, вы можете эмулировать матрицу.

Если вы хотите, чтобы найти индексы, то вы можете использовать эту изящную маленькую функцию:

def finder(value_to_find, matrix): 
    for r, row in enumerate(matrix): 
     for c, col in enumerate(row): 
      if col == value_to_find: 
       return r, c 

И для демонстрации:

>>> a = [[1,2], [3, 4]] 
>>> a[0][0] 
1 
>>> a[0][1] 
2 
>>> a[1][0] 
3 
>>> a[1][1] 
4 
>>> def finder(value_to_find, matrix): 
    for r, row in enumerate(matrix): 
     for c, col in enumerate(row): 
      if col == value_to_find: 
       return r, c 
>>> finder(4, a) 
(1, 1) 

А вот объяснение с комментариями:

def finder(value_to_find, matrix): 
    """ 
    Function to find the indexes of a given value, on first notice 
    @param value_to_find: The value we need to find 
    @param matrix: The matrix we are to work with 
    @return: A tuple of row, column 
    """ 
    # Looping over the rows (lists within the main matrix) 
    for r, row in enumerate(matrix): # Using enumerate returns the index, r and the value row (which is a list) 
     for c, col in enumerate(row): # Looping over the values in each row, with index c and value col 
      if col == value_to_find: # If the col is equal to the value we want, then we return the row, column tuple 
       return r, c 

Если у вас есть одномерная матрица, вы можете посмотреть это решение от Hyperborius:

listindex = row * length_of_row + column 
+0

долгое время не виделись мужчиной;), BTW Я был «бой, чтобы опубликовать это сообщение –

+0

hahaha, ну, извините, я победил вас. Вам нужно больше rep, чем я :) –

+0

Я думаю, это хороший ответ. – aIKid

3
a = [[1,2], [3, 4]] 

, если a является матрицей, мы можем получить доступ к отдельным элементам с помощью двух параметров строки и столбца. Здесь row относится к числу перечня, и column будет ссылаться на позицию элемента в списке.

Итак, column - не что иное, как обычный способ ссылки на элемент в списке, а row - не что иное, как обычный способ ссылки на список внутри списка. Оба row и column являются индексами с нулевым индексом.

Формат

a[row][column] 

, когда мы говорим

a[row] 

это означает, что из списка списков, получить список в позиции row и когда мы говорим

a[row][column] 

мы говорим, что из списка, который мы хотим, выберите элемент в позиции column.

0

Если у вас есть кортеж кортежей:

>>> a = ((1,2,3),(4,5,6),(7,8,9)) 

который вы преобразованы в плоский список, по-видимому, используя технику вроде этого (кредиты Joel Корнетт, https://stackoverflow.com/a/10636583/219229):

>>> b = list(sum(a,())) 
>>> b 
[1, 2, 3, 4, 5, 6, 7, 8, 9] 

Таким образом, b фактически потерял первоначальную многомерную индексацию. Если вы уже знаете, исходный индекс от a, вы можете рассчитать свой индекс в b следующим образом:

>>> matrix_width = len(a[0]) 
... (assuming you have the indices i,j) ... 
>>> index_in_b = j*matrix_width + i 
>>> item_to_find = b[index_in_b] 

Если развернуть это многомерные массивы, как 3d-массив, и у вас есть индексы i, j, k, то она должна быть index = i + (j * width) + (k * width * span), где width = a[0][0] и span = a[0]


P/S: Только в случае, если вы хотите, чтобы преобразовать его в список списков, вот некоторые Shorthands вы можете использовать:

>>> b = list[map(list,a)] # using map 
>>> b = [list(x) for x in a] # using list comprehension 
Смежные вопросы