Estoy tratando de crear un diccionario anidado que tenga claves de sub-diccionario como los elementos restantes de la lista. Para explicarlo de una manera más simple:
Salida requerida:
payable = { 'A':{'B':0,'C':0},'B':{'A':0,'C':0}....}
Salida:
payable = { 'A':{'B':0,'C':0,'A':0},'B':{'A':0,'C':0,'B':0}....}
No necesito la 'A'
subclave debajo de la 'A'
tecla principal. ¿Cómo puedo solucionar esto?
names = ['A', 'B', 'C']
payable = dict.fromkeys(names, {})
for mainKey in payable.keys():
for subKey in names:
if(mainKey != subKey):
payable[mainKey][subKey] = 0
print(payable)
3 respuestas
Cuando crea usando dict.fromkeys
, todas las claves están mirando a la misma dict
.
Intente crear payable
con dict
comprensión (en otras palabras, nuevo dict
para cada tecla) y funciona bien:
names = ['A','B','C']
payable= {k:{} for k in names}
for mainKey in payable.keys():
for subKey in names:
if(mainKey!=subKey):
payable[mainKey][subKey]=0
print(payable)
Salida:
{'A': {'B': 0, 'C': 0}, 'B': {'A': 0, 'C': 0}, 'C': {'A': 0, 'B': 0}}
Una comprensión simple como esta también funcionaría:
>>> names = ['A', 'B', 'C']
>>> {x: dict.fromkeys(names[:i] + names[i+1:], 0) for i, x in enumerate(names)}
{'A': {'B': 0, 'C': 0}, 'B': {'A': 0, 'C': 0}, 'C': {'A': 0, 'B': 0}}
Explicación:
- Obtenga todos los demás elementos con corte de lista:
names[:i] + names[i+1:]
- inicialice los valores del diccionario a cero con
dict.fromkeys
- Utilice
enumerate
para iterar sobre el índice y el elemento denames
Además, podemos usar la diferencia establecida si no nos importa el orden de las teclas, como VPfb se muestra en los comentarios:
>>> names = {'A', 'B', 'C'}
>>> {x: dict.fromkeys(names - {x} , 0) for x in names}
{'B': {'C': 0, 'A': 0}, 'C': {'B': 0, 'A': 0}, 'A': {'B': 0, 'C': 0}}
Aquí hay una solución alternativa
names = ['A','B','C']
payable = dict()
for key in names:
tmp = dict()
for sub in names:
if sub == key:
tmp[sub] = 0
payable[key] = tmp
print(payable)
# {'A': {'A': 0}, 'B': {'B': 0}, 'C': {'C': 0}}
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.