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) 
2
kunal dubey 29 sep. 2019 a las 13:18

3 respuestas

La mejor respuesta

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}}
5
Chris 29 sep. 2019 a las 10:27

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 de names

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}}
2
RoadRunner 29 sep. 2019 a las 14:26

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}}
0
user101 29 sep. 2019 a las 10:28
58154291