Доступ к словарю 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)
не может быть непосредственно использован в понимании.