Python crea un diccionario de listas


Answers

Puedes construirlo con una lista de comprensión como esta:

>>> dict((i, range(int(i), int(i) + 2)) for i in ['1', '2'])
{'1': [1, 2], '2': [2, 3]}

Y para la segunda parte de tu pregunta usa defaultdict

>>> from collections import defaultdict
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> for k, v in s:
        d[k].append(v)

>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
Question

Quiero crear un diccionario cuyos valores sean listas. Por ejemplo:

{
  1: ['1'],
  2: ['1','2'],
  3: ['2']
}

Si lo hago:

d = dict()
a = ['1', '2']
for i in a:
    for j in range(int(i), int(i) + 2): 
        d[j].append(i)

Obtengo un KeyError porque d [...] no es una lista. En este caso, puedo agregar el siguiente código después de la asignación de a para inicializar el diccionario.

for x in range(1, 4):
    d[x] = list()

¿Hay una mejor manera de hacer esto? Digamos que no sé las llaves que voy a necesitar hasta que esté en el segundo ciclo for . Por ejemplo:

class relation:
    scope_list = list()
...
d = dict()
for relation in relation_list:
    for scope_item in relation.scope_list:
        d[scope_item].append(relation)

Una alternativa sería reemplazar

d[scope_item].append(relation)

con

if d.has_key(scope_item):
    d[scope_item].append(relation)
else:
    d[scope_item] = [relation,]

¿Cuál es la mejor manera de manejar esto? Idealmente, agregar "simplemente funcionaría". ¿Hay alguna forma de expresar que quiero un diccionario de listas vacías, incluso si no conozco todas las claves cuando primero creo la lista?




Su pregunta ya ha sido respondida, pero IIRC puede reemplazar líneas como:

if d.has_key(scope_item):

con:

if scope_item in d:

Es decir, d referencia a d.keys() en esa construcción. A veces, el defaultdict no es la mejor opción (por ejemplo, si desea ejecutar varias líneas de código después del else asociado con el anterior if ), y creo que la sintaxis es más fácil de leer.




Related