2012-02-05 20 views
11

Tengo una lista de listas como esta.¿Cómo iterar a través de una lista de listas en python?

documents = [['Human machine interface for lab abc computer applications','4'], 
      ['A survey of user opinion of computer system response time','3'], 
      ['The EPS user interface management system','2']] 

ahora tengo que recorrer la lista anterior y de salida una lista de cadenas, como se muestra a continuación (sin los números en la lista original)

documents = ['Human machine interface for lab abc computer applications', 
      'A survey of user opinion of computer system response time', 
      'The EPS user interface management system'] 
+4

no hay matrices en pitón, que significa ' list's. – juliomalegria

Respuesta

27

La solución más sencilla para hacer exactamente lo que especificada es:

documents = [sub_list[0] for sub_list in documents] 

Esto es básicamente equivalente a la versión iterativa:

temp = [] 
for sub_list in documents: 
    temp.append(sub_list[0]) 
documents = temp 

Sin embargo, esta no es realmente una forma general de iterar a través de una lista multidimensional con un número arbitrario de dimensiones, ya que las listas anidadas de comprensión/anidados para bucles pueden ponerse feas; sin embargo, deberías estar seguro haciéndolo para listas de 2 o 3-d.

Si decide que necesita aplanar más de 3 dimensiones, le recomiendo implementar un recursive traversal function que aplana todas las capas no planas.

+4

+1 para comprensiones de listas – Zenon

+0

Gracias :) Funcionó. – ChamingaD

8

Si desea repetir simplemente a través del bucle y hacer cosas con los elementos (en lugar de los resultados específicos solicitados en la pregunta), se puede usar un básico de bucle

for row in documents: 
    #do stuff with the row 
    print(row) 

    for column in row: 
    #do stuff with the columns for a particular row 
    print(column) 

    if(row[1] > 10): 
    print('The value is much too large!!') 

Ésta es una característica del lenguaje conocido como "flow control".

Tenga en cuenta que si solo desea el resultado dado en la pregunta, una anotación de máquina como list comprehension es la mejor manera de hacerlo.

documents = [doc[0] for doc in documents] 

Nota que descarta su lista de documentos originales (va a sobrescribir la variable original) a fin de utilizar lo siguiente si desea tener una copia de la primera columna, así como una copia de su lista original:

document_first_row = [doc[0] for doc in documents] 
+0

Gracias por la ayuda :) – ChamingaD

2

** edit. gracias DSM. Esto está mal ya que simplemente aplana las listas. No noté los datos adicionales dentro de la lista después del texto que OP quiere ignorar.

Ok, lo haré realmente fácil para usted!

itertools.chain.from_iterable(documents) 

Como han dicho otros, depende de qué comportamiento final necesite. Entonces, si necesita algo más complejo que eso, use un recorrido recursivo o, si es como yo, use un recorrido iterativo. Puedo ayudarte con eso si lo necesitas.

+0

Esto aplanará la lista, no extraerá los primeros elementos. – DSM

+0

de hecho. Leí mal el comportamiento que él quiere. la oferta de ayuda con el recorrido sigue abierta – KobeJohn

+0

Gracias por la ayuda :) – ChamingaD

0

También puede usar zip con el argumento de desembalar para transformar una lista de "filas" en una lista de columnas:

rows=[[1,'a','foo'], 
     [2,'b','bar'], 
     [3,'c','baz']] 

columns=zip(*rows) 
print columns 
#[(1,2,3), 
# ('a','b','c'), 
# ('foo','bar','baz')] 
print columns[0] 
#(1,2,3) 

el operador * pasa a todas las filas de argumentos como separados de cremallera

zip(*rows) == zip(row1,row2,row3,...) 

postal toma todas las filas y columnas se reúne con un artículo de cada lista

0

podría utilizar numpy gama

por ejemplo

document = [['the quick brown fox', '2' ],['jumped over the lazy fox ','3']] 

#

import numpy as np 
document = np.array(document) 
document=document[:,0] 
0

La cuestión está muerto pero aún sabiendo una forma más no hace daño:

documents = [['Human machine interface for lab abc computer applications','4'], 
     ['A survey of user opinion of computer system response time','3'], 
     ['The EPS user interface management system','2']] 

document = [] 
for first,*remaining in documents: 
    document.append(first) 

print(document) 
['Human machine interface for lab abc computer applications', 
'A survey of user opinion of computer system response time', 
'The EPS user interface management system' 
] 
Cuestiones relacionadas