Как индексировать вложенные списки в Python?


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

A = [('a', 'b', 'c'),
     ('d', 'e', 'f'),
     ('g', 'h', 'i')]

И я пытаюсь напечатать первый элемент каждого списка, используя код:

A = [('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'h', 'i')]
print A[:][0]

Но я получаю следующий результат:

('a', 'b', 'c')

Требуемый выход:

('a', 'd', 'g')

Как получить этот вывод в Python?

5 5

5 ответов:

A[:] просто создает копию всего списка, после чего вы получаете элемент 0 этой копии.

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

[tup[0] for tup in A]

, чтобы получить список, или используйте tuple() с выражением генератора, чтобы получить Кортеж:

tuple(tup[0] for tup in A)

Демо:

>>> A = [('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'h', 'i')]
>>> [tup[0] for tup in A]
['a', 'd', 'g']
>>> tuple(tup[0] for tup in A)
('a', 'd', 'g')

Вы можете транспонировать список списков/кортежей с помощью zip(*list_of_lists), а затем выбрать нужные элементы.

>>> a
[('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'h', 'i')]
>>> b = zip(*a)
>>> b
[('a', 'd', 'g'), ('b', 'e', 'h'), ('c', 'f', 'i')]
>>> b[0]
('a', 'd', 'g')
>>> 
>>> c = zip(*a)[0]
>>> c
('a', 'd', 'g')
>>>

Вы также можете сделать это следующим образом:

>>> A = [('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'h', 'i')]
>>> map(lambda t:t[0], A)
['a', 'd', 'g']
>>> tuple(map(lambda t:t[0],A))
('a', 'd', 'g')

Списки Python не очень хорошо работают с многомерными массивами. Если вы хотите добавить дополнительную зависимость(например, если вы собираетесь делать много манипуляций с массивами), numpy позволяет вам использовать почти точный синтаксис, который вы ищете

import numpy as np
A = np.array([('a', 'b', 'c'),
              ('d', 'e', 'f'),
              ('g', 'h', 'i')])

Это выводит строку в виде np.массив(к которому можно обращаться как к списку):

>>> A[:,0]
array(['a', 'd', 'g'])

Чтобы получить первый ряд в виде кортежа:

>>> tuple(A[:,0])
('a', 'd', 'g')

Вы также можете получить желаемое поведение, используя pandas следующим образом:

In [1]: import pandas as pd

In [2]: A = [('a', 'b', 'c'),
     ('d', 'e', 'f'),
     ('g', 'h', 'i')]

In [3]: df = pd.DataFrame(A)

In [4]: df[:][0]
Out[4]:
0    a
1    d
2    g
Name: 0, dtype: object

In [5]: df[:][0].values
Out[5]: array(['a', 'd', 'g'], dtype=object)