Доступ к словарю Python для доступа к несуществующему ключу

Я пытаюсь создать словарь, который будет выглядеть так, если n == 3

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

В основном... просто диктат с ключами, которые сопоставлены с массивами, которые содержат другие целые числа ключей, кроме того, к которому он был привязан. Мой код:

import itertools

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

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

Я не уверен, почему эта ошибка выбрасывается ValueError: list.remove(x): x not in list

После небольшого исследования выяснилось, что я мог бы вычитать наборы и делать все это за один раз:

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

Спасибо всем!

3 ответа

Решение

Это потому type(graph[i]) это не listего типа range, Преобразуйте его в список и попробуйте это:

[Редактировать: удалено вычитание, проверьте комментарий sgarza62]

import itertools    

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

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

До редактирования это было ошибкой.

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]}

Если вы хотите использовать dict-понимание без дополнительного цикла for, попробуйте это:

import itertools
num_nodes = 3

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

Примечание: к сожалению, объединение списка необходимо, так как list.remove(x) не возвращает обновленный список, но изменяет список на месте и ничего не возвращает. Таким образом, range(num_nodes).remove(i-1) не может быть непосредственно использован в понимании.

Другие вопросы по тегам