2015-07-08 19 views
5

Ho una lista annidata come illustrato di seguito:Come indicizzare gli elenchi annidati in Python?

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

e sto cercando di stampare il primo elemento di ciascuna lista utilizzando il codice:

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

Ma ottengo il seguente output:

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

uscita richiesto:

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

Come ottenere questo output in Python?

risposta

6

A[:] crea solo una copia dell'intera lista, dopo di che si ottiene l'elemento 0 di quella copia.

È necessario utilizzare un elenco di comprensione qui:

[tup[0] for tup in A] 

per ottenere un elenco oppure usa tuple() con un'espressione generatore per ottenere una tupla:

tuple(tup[0] for tup in A) 

Demo:

>>> 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') 
1

Gli elenchi di Python non funzionano molto bene come array multidimensionali. Se siete disposti ad aggiungere una dipendenza extra (ad esempio, se avete intenzione di fare un sacco di manipolazione array), numpy consente di utilizzare la quasi la sintassi esatta che stai cercando

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

Questo emette la riga come np.array (cui si può accedere come un elenco):

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

Per ottenere la prima riga come una tupla:

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

È possibile trasporre un elenco di liste/tuple con zip(*list_of_lists) quindi selezionare gli elementi desiderati.

>>> 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') 
>>> 
1

È inoltre possibile fare in questo modo:

>>> 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') 
1

È possibile anche ottenere il comportamento desiderato tramite pandas come segue:

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)