2012-06-29 22 views
60

Tengo un problema con los corchetes en Python. Escribí un código que produce el siguiente resultado:Acoplar la lista de listas

[[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]] 

Pero me gustaría realizar algunos cálculos con eso, sino que los corchetes no me lo permite.

¿Cómo puedo eliminar los soportes? Vi algunos ejemplos para hacer eso, pero no pude aplicarlos a este caso.

+2

En otras palabras, usted tiene una lista de listas y que desea poder hacer trabajo en todos los miembros de las listas internas? Además, dado que todas estas listas internas tienen un solo valor, ¿vale la pena garantizar que solo el valor se inserte en la lista externa?¿O es posible que algunas de las listas tengan múltiples elementos? Es importante brindar toda la información posible, lo más precisa posible. –

+12

Para ayudar a las personas a responder sus preguntas en el futuro, trate de evitar declaraciones generales como "los corchetes no me dejan" y en su lugar, brinde un ejemplo específico de algo que intentó hacer que no funcionó, y copie y pegue un pequeño código de prueba que muestre el error resultante. – DSM

+0

relacionado [aplastar lista anidada] (http://stackoverflow.com/q/952914/4279) – jfs

Respuesta

10

Dado

d = [[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]] 

y su pregunta específica :¿Cómo puedo quitar los soportes?

lista mediante la comprensión:

new_d = [i[0] for i in d] 

te dará esta

[180.0, 173.8, 164.2, 156.5, 147.2, 138.2] 

entonces se puede acceder a los elementos individuales con el índice apropiado, por ejemplo, new_d[0] le dará 180.0, etc, que luego se puede usar para matemáticas

Si va a tener una colección de datos, tendrá algún tipo de corchete o paréntesis.

Nota, esta solución está dirigida específicamente a su pregunta/problema, no proporciona una solución generalizada. Es decir, funcionará para su caso.

+7

El OP tiene poca idea acerca de listas, dándole esto Una solución puede causar efectos no deseados si quiere usarla para aplanar múltiples elementos (sin error, simplemente devuelve el primero en silencio ...) – estani

113

Allanar la lista a "eliminar los corchetes" utilizando una lista anidada de comprensión. ¡Esto anulará cada lista almacenada en su lista de listas!

list_of_lists = [[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]] 
flattened = [val for sublist in list_of_lists for val in sublist] 

listas por comprensión anidadas evalúan de la misma manera que se desenvuelva (es decir, añadir nueva línea y ficha para cada nuevo bucle Así que en este caso:.

flattened = [val for sublist in list_of_lists for val in sublist] 

es equivalente a:

flattened = [] 
for sublist in list_of_lists: 
    for val in sublist: 
     flattened.append(val) 

La gran diferencia es que la lista de comp evalúa MUCHO más rápido que el bucle desenredado y elimina las llamadas anexadas!

Si tiene varios elementos en una sublista, la compilación de la lista incluso aplanará eso. es decir

>>> list_of_lists = [[180.0, 1, 2, 3], [173.8], [164.2], [156.5], [147.2], [138.2]] 
>>> flattened = [val for sublist in list_of_lists for val in sublist] 
>>> flattened 
[180.0, 1, 2, 3, 173.8, 164.2, 156.5, 147.2,138.2] 
+17

Usar 'itertools.chain.from_iterable' es mucho más simple. –

+4

Explique por qué. Esto es casi tan simple como –

+5

Lo siento, quise decir más legible/intuitivo. Como el OP tiene problemas para eliminar la ambigüedad entre las listas (secuencias de datos) y cómo se representan las listas en el código (con corchetes), dudo mucho que una comprensión de la lista doble tenga algún sentido para él. –

2
>>> lis=[[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]] 
>>> [x[0] for x in lis] 
[180.0, 173.8, 164.2, 156.5, 147.2, 138.2] 
80

me gustaría utilizar itertools.chain - Esto también atender a> 1 elemento de cada sublista:

from itertools import chain 
list(chain.from_iterable([[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]])) 
+0

+1 para 'itertools', iba a publicar una respuesta similar pero me ganaste. –

+7

¿Por qué importarías un módulo completo para hacer algo tan simple como esto? –

+0

@PaulSeeb método más simple, genérico e integrado de aplanar un iterable de iterables ... ¿Qué pasaría si las sublistas tuvieran 100 elementos? Ciertamente no me gustaría estar escribiendo el código listcomp para ese ... –

Cuestiones relacionadas