2012-05-13 14 views
5

Tengo una lista de Python con elementos que son una lista que contiene una cadena de una letra y número y me preguntaba cómo podría dividir la lista en el carácter al comienzo de la cadena sin crear una declaración para cada personaje. Así que quiero dividir mi lista en listas a, b, y c.División de una lista de Python por un personaje en cada elemento

mylist = [['a1'],['a2'],['c1'],['b1']] 
a = [['a1'],['a2']] 
b = [['b1']] 
c = [['c1']] 

Es importante que los guardo como una lista de listas (a pesar de que es sólo un elemento individual en cada pequeña lista).

Gracias

Respuesta

4

esto funcionará:

import itertools as it 

mylist = [['a1'],['a2'],['c1'],['b1']] 
keyfunc = lambda x: x[0][0] 

mylist = sorted(mylist, key=keyfunc) 
a, b, c = [list(g) for k, g in it.groupby(mylist, keyfunc)] 

La línea en la que se utiliza sorted() es necesario sólo si los elementos en mylist no están ya ordenados por el carácter en el inicio de la cadena.

EDIT:

Como se señaló en los comentarios, una solución más general (uno que no restringe el número de variables a sólo tres) estaría utilizando comprensiones del diccionario (disponible en Python 2.7+) como esto:

result_dict = {k: list(g) for k, g in it.groupby(mylist, keyfunc)} 

Ahora la respuesta que se teclea en el diccionario por el primer carácter:

result_dict['a'] 
> [['a1'],['a2']] 

result_dict['b'] 
> [['b1']] 

result_dict['c'] 
> [['c1']] 
+1

Buena solución, pero tal vez debería quedar claro que el código se bloqueará si hubiera un 'd1' en la lista. Dicho esto, sería mejor reemplazar la última fila con 'result_dict = {k: list (g) para k, g en it.groupby (mylist, keyfunc)}' que tendrá las letras como claves y las listas como elementos. .. – deinonychusaur

+0

@deinonychusaur ¡Gracias por tu sugerencia! Actualicé mi respuesta. –

2

El uso de un diccionario podría funcionar también

mylist = [['a1'],['a2'],['c1'],['b1']] 

from collections import defaultdict 

dicto = defaultdict(list) 

for ele in mylist: 
    dicto[ele[0][0]].append(ele) 

Resultado:

>>> dicto 
defaultdict(<type 'list'>, {'a': [['a1'], ['a2']], 'c': [['c1']], 'b': [['b1']]}) 

No da el resultado exacto que estaba pidiendo; Sin embargo, es bastante fácil de acceder a una lista de listas asociadas con cada letra

>>> dicto['a'] 
[['a1'], ['a2']] 
+0

I +1 esta porque funciona con cualquier número de caracteres iniciales, por lo que no está limitado a 'a',' b', 'c'. –

0

También puede obtener estas listas secundarias mediante el uso de una función simple:

def get_items(mylist, letter): 
    return [item for item in mylist if item[0][0] == letter] 

La expresión item[0][0] significa simplemente para obtener el primera letra del primer elemento del elemento actual. A continuación, puede llamar a la función para cada letra:

a = get_items(mylist, 'a') 
b = get_items(mylist, 'b') 
c = get_items(mylist, 'c') 
Cuestiones relacionadas