Quiero crear un diccionario cuyos valores son 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)
Me sale 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 claves que voy a necesitar hasta que esté en el segundo for
ciclo. 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, anexar "simplemente funcionaría". ¿Hay alguna forma de expresar que quiero un diccionario de listas vacías, incluso si no conozco todas las claves cuando creo la lista por primera vez?
python
dictionary
usuario118662
fuente
fuente
collections
módulo también funcionan de esta manera, por ejemplocollections.OrderedDict
.NameError: name 'a' is not defined
Puedes construirlo con una lista de comprensión como esta:
Y para la segunda parte de su pregunta use defaultdict
fuente
Puedes usar
setdefault
:La
setdefault
función de nombre extraño dice "Obtenga el valor con esta clave, o si esa clave no está allí, agregue este valor y luego devuélvalo".Como otros han señalado correctamente,
defaultdict
es una opción mejor y más moderna.setdefault
sigue siendo útil en versiones anteriores de Python (anteriores a la 2.5).fuente
Su pregunta ya ha sido respondida, pero IIRC puede reemplazar líneas como:
con:
Es decir,
d
referenciasd.keys()
en esa construcción. A vecesdefaultdict
no es la mejor opción (por ejemplo, si desea ejecutar varias líneas de código después de loelse
asociado con lo anteriorif
), y encuentro que lain
sintaxis es más fácil de leer.fuente
Personalmente, solo uso JSON para convertir cosas en cadenas y viceversa. Cuerdas que entiendo.
fuente
manera fácil es:
fuente