software2

La creación de un diccionario de las listas en Python

2018-04-29, Comentarios

Supongamos que usted tiene una lista de objetos que se desea convertir en un diccionario de asignación de alguna clave del objeto de la (sub-)de la lista de objetos con la clave. Para proporcionar un ejemplo sencillo, vamos a empezar con una lista de frutas.

a partir de colecciones de importación namedtuple Fruta = namedtuple('Fruta', 'nombre del color") def banana (el): el retorno de la Fruta('banana', 'amarillo')
def uva(): return Fruta('uva', 'verde')
def pera(): return Fruta('pera', 'verde')
def fresa(): return Fruta('fresa', 'rojo')
def cereza(): return Fruta('cherry', 'rojo') frutas = [ plátano(), pera(), cereza(), cereza(), pera(), uva(), plátano(), uva(), cereza(), uva(), fresa(), pera(), uva(), cereza()] 

Nos gustaría organizar un fruitbowl — un diccionario que grupos de frutos por color. Esto se puede hacer mediante la creación de un recipiente vacío, entonces la iteración a través de los frutos de colocar a cada uno en la lista correcta.

fruitbowl = {} de la fruta en las frutas: fruitbowl.setdefault(de la fruta.color, []).append(fruta) 

Dict.setdefault es un poco de una rareza en Python, por tanto para hacer algo y devolver un valor, pero es una forma abreviada conveniente en este caso. A pesar de esta ventaja es más común el uso de un defaultdict.

a partir de colecciones de importación defaultdict fruitbowl = defaultdict(lista) de la fruta en las frutas:
fruitbowl[de la fruta.color].append(fruta) 

Aquí está una función para mostrar el fruitbowl.

def print_bowl(bol):
print('\n'.únete a( '{}: {}'.formato(color, ', '.únete a(f.nombre de f en frutas)) para el color, las frutas en un tazón.los elementos())) 

Si llamamos a esta función, vemos los frutos de hecho, han sido agrupados por color.

>>> print_bowl(fruitbowl)
amarillo: el banano, el plátano
verde: pera, pera, uva, uva, uva, pera, uva
rojo: cereza, cereza, cereza, fresa, cereza 

Todo esto está bien y modismos de Python, pero cada vez que veo un vacío dict ser creado seguido por un bucle para rellenar, me pregunto si una comprensión podría ser utilizado.

Es allí una manera de declarar e inicializar el diccionario en una sola expresión? Aquí es la mejor que se me ocurrió.

de operador de importación attrgetter
de itertools de importación groupby color = attrgetter('color') fruitbowl = { col: lista(fts) para col, fts en groupby(ordenados(frutas, clave=color), color)} 

Es mejor que el defaultdict solución. Probablemente no, pero es una técnica que vale la pena recordar. Tal vez el fruitbowl no es necesario, y que en realidad sólo necesita iterar a través de los frutos agrupados por color. Por ejemplo, de qué color es el más popular?

> > > > max(fruitbowl.los elementos(), clave=lambda kv: len(kv[1]))[0] 'verde' 

El uso de groupby, no necesitamos el tazón.

>>> def grouplen(k_gp):
... return sum(1 de _ en k_gp[1])
> > > > max(groupby(ordenados(frutas, clave=color), color), clave=grouplen)[0]
>>> 'verde' 

En este caso, no necesitamos agrupar bien. Hay más de una manera de hacerlo.

>>> a partir de colecciones de importación Contador
>>> Contador(map(color, frutas)).most_common(1)
[('verde', 7)] 

Software almacen de Cea Ordenadores

Comentarios desactivados en La creación de un diccionario de las listas en Python