2016-08-19 2 views
0

У меня есть код, который я анализирую. Но я обнаружил, что итерация по словарю опустошает его. Я исправил эту проблему, сделав глубокую скопированность словаря и повторив ее в некотором коде, который отображает значения, а затем использует исходный словарь для повторения этого назначения для назначения значений 2D-массиву. Почему итерация над исходным словарем, чтобы отобразить его, пустая, так что позднее использование словаря непригодно, так как оно теперь пустое? Любые ответы приветствуются.python итерация по словарю emptys it

import copy 

# This line fixed the problem 
trans = copy.deepcopy(transitions) 

print ("\nTransistions = ") 
# Original line was: 
# for state, next_states in transitions.items(): 
# Which empties the dictionary, so not usable after that 

for state, next_states in trans.items(): 
    for i in next_states: 
     print("\nstate = ", state, " next_state = ", i) 

# Later code which with original for loop showed empty dictionary 
for state, next_states in transitions.items(): 
    for next_state in next_states: 
     print("\n one_step trans state = ", state, " next_state = ", next_state) 
     one_step[state,next_state] += 1 

Отпечаток словаря:

Transistions = 
{0: <map object at 0x0000000003391550>, 1: <map object at 0x00000000033911D0>, 2: <map object at 0x0000000003391400>, 3: <map object at 0x00000000033915F8>, 4: <map object at 0x0000000003391320>} 

Тип:

Transistions = 
<class 'dict'> 

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

numbers = dict((state_set, n) for n, state_set in enumerate(sets)) 

transitions = {} 
for state_set, next_sets in state_set_transitions.items(): 
    dstate = numbers[state_set] 
    transitions[dstate] = map(numbers.get, next_sets) 
+1

Перебора Dict не опорожняет его. У вас есть еще одна ошибка. – user2357112

+0

Какой тип 'переходов'? Вы уверены, что это словарь? Попробуйте 'print (type (transitions))' и вставьте результат. –

ответ

1

Итерация по диктору не пустая. Итерация на карте итератор пуст.

Где бы вы создали свой transitions Dict, вы должны были использовать список понимание вместо map для создания списков вместо итераторов для значений:

[whatever for x in thing] 

вместо

map(lambda x: whatever, thing) 
+0

OK. Благодарю. Я анализирую какой-то код, созданный кем-то другим, поэтому я заметил в других частях кода, что он использовал карту. Возможно, этого человека не должно было быть. Я посмотрю, могу ли я изменить код для создания словаря, как вы объяснили. Будут ли какие-либо различия в коде и производительности, если я буду делать то, что вы предлагаете? – te7

+0

@ te7: Различия в коде были бы простыми, похожими на то, что я показал выше. Будут отличия в производительности; положительный или отрицательный, вы не должны беспокоиться о них. По сути, никогда не имеет смысла сравнивать производительность рабочего кода и неправильного кода. – user2357112

+0

@ user2357112 Хорошо. Благодарю. См. Мое редактирование – te7

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