Можно ли индексировать вложенные списки с помощью кортежей в python?


Я только начал с python и очень скоро задался вопросом, возможно ли индексировать вложенный список с помощью кортежа. Что-то вроде: elements[(1,1)]

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

elements = [ [ 'a', 'b', 'c'],
             [ 'c', 'd', 'e'],
             [ 'f', 'g', 'h'] ]

for i in index:
    print (elements [ i[0] ] [ i[1] ])

    # I would like to do this:
    # print(elements[i])

Это кажется полезной функцией. Есть ли какой-нибудь способ сделать это? Или, может быть, простая альтернатива?

5 6

5 ответов:

Да, вы можете сделать это. Я написал аналогичный пример:

index = [ [0,0], [0,2], [2,0], [2,2] ]

elements = [ [ 'a', 'b', 'c'],
             [ 'c', 'd', 'e'],
             [ 'f', 'g', 'h'] ]

for i,j in index:
    print (elements [ i ] [ j ])

A c f h

Если вы действительно хотите использовать кортежи для индексирования, вы можете реализовать свой собственный класс, который расширяет list и переопределяет __getattr__ для работы с кортежами и использовать это:

class TList(list):
    def __getitem__(self, index):
        if hasattr(index, "__iter__"):
            # index is list-like, traverse downwards
            item = self
            for i in index:
                item = item[i]
            return item
        # index is not list-like, let list.__getitem__ handle it
        return super().__getitem__(index)

elements = TList([ [ 'a', 'b', 'c'],
                   [ 'c', 'd', 'e'],
                   [ 'f', 'g', 'h'] ])
index = ( (0,0), (0,2), (2,0), (2,2) )
for i in index:
    print(elements[i])

A
c
f
h

# I would like to do this:
# print(elements[i])

Нет вы не можете индексировать конкретное значение вложенного списка таким образом.

Единственным немного лучшим способом было бы "распаковать" кортежи, которые вы повторяете над ними:

Пример:

for i, j in index:
    print(elements[i][j])

См.: кортежи и последовательности

Если вы хотите напечатать все в элементах

index = ( (0,0), (0,2), (2,0), (2,2) )

elements = [ [ 'a', 'b', 'c'],
             [ 'c', 'd', 'e'],
             [ 'f', 'g', 'h'] ]

for row in elements:
    for i in range(len(row)):
        print (row[i])

Вы можете использовать список понятий:

index = ((0, 0), (0, 2), (2, 0), (2, 2))

elements = [['a', 'b', 'c'],
            ['c', 'd', 'e'],
            ['f', 'g', 'h']]

tmp = [print(elements[i][j]) for i,j in index]