2014-09-02 1 views
1

Я пытаюсь создать словарь, который будет выглядеть следующим образом, если n == 3Python словарь Постижение доступа к несуществующему ключу

{ 
    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)}

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

+4

Что происходит с 'перестановками' и' num_nodes - 1'? Похоже, вы могли бы заменить это целое выражение на значения в понимании с помощью 'range (num_nodes)'. – user2357112

+0

Возможно, вам придется разобрать ключ на int ... 'graph [i] .remove (int (i))'? –

+1

Кажется, у вас есть список итераций 'itertools.permutations', а не список целых чисел, как вы, кажется, ожидаете. – mgilson

ответ

2

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

[Edit: снятое вычитание, проверьте sgarza62-х comment]

import itertools  

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

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

OP, кажется, использует Python 2. Если неправильный тип был проблемой, сообщение об ошибке было бы чем-то вроде «у объекта диапазона нет атрибута« remove ».». –

+0

Спасибо. Я был немного смущен другими комментариями. Ясно! –

+0

@BenPoon Прошу прояснить, какую версию python вы используете? – ashwinjv

1

До редактирования, это была ошибка совсем по-одному.

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

Этот код теперь совпадает с кодом в вопросе, так как вопрос был обновлен снова. –

+0

После того, как этот вопрос отредактирует, код в деталях вопроса совершенно корректен (он больше не будет вызывать «ValueError»). Так что это уже не вопрос :-) В любом случае, до исправления в деталях вопроса, это решило проблему. Рад, что он это исправил. – sgarza62

+1

Извините за редактирование ниндзя! Спасибо за ваш вклад. –

1

Если вы хотите использовать Dict понимание без дополнительного цикла, попробуйте следующее:

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

 Смежные вопросы

  • Нет связанных вопросов^_^