Estoy tratando de crear un diccionario que se vea así si n == 3

{
  0: [1, 2],
  1: [0, 2],
  2: [0, 1]
}

Básicamente ... solo un dict con claves que se asignaron a matrices que contenían los otros enteros clave excepto el que estaba asignado. Mi código:

import itertools

graph = {i: range(num_nodes) for i in range(num_nodes)}

for i in graph.keys():
    graph[i].remove(i)

No estoy segura de por qué se está lanzando este error ValueError: list.remove(x): x not in list

Después de un poco más de investigación, descubrí que podía hacer una resta entre series y hacerlo todo de una vez:

graph = {i: list(set(range(num_nodes)) - set([i])) for i in range(num_nodes)}

Gracias a todas!

1
Ben Poon 3 sep. 2014 a las 00:51

3 respuestas

La mejor respuesta

Esto se debe a que type(graph[i]) no es un list, es del tipo range. Conviértalo a una lista e intente esto:

[Editar: resta eliminada, verifique comentario] de sgarza62

import itertools    

graph = {i: list(range(num_nodes)) for i in range(num_nodes)}

for i in graph.keys():
    graph[i].remove(i)
2
Community 23 may. 2017 a las 12:05

Antes de la edición, era un error off-by-one.

import itertools

num_nodes = 3
graph = {i: range(num_nodes) for i in range(num_nodes)}

for i in graph.keys():
    graph[i].remove(i)

print graph
# {0: [1, 2], 1: [0, 2], 2: [0, 1]}
1
sgarza62 2 sep. 2014 a las 21:12

Si desea utilizar una comprensión dict sin un bucle for adicional, intente esto:

import itertools
num_nodes = 3

graph = {i: (range(num_nodes)[:i] + range(num_nodes)[i+1:]) for i in range(num_nodes)}

Nota: Desafortunadamente, la concatenación de la lista es necesaria, ya que list.remove(x) no devuelve una lista actualizada, pero cambia la lista en su lugar y no devuelve nada. Por lo tanto, range(num_nodes).remove(i-1) no se puede usar directamente en la comprensión.

1
sebastian_oe 2 sep. 2014 a las 21:17