2016-08-19 8 views
0

私は分析しているいくつかのコードがあります。しかし、私は辞書を反復することでそれが空になることを発見しました。私は、ディクショナリのディープコピーを作成し、値を表示するコードでそれを反復し、後で元のディクショナリを使用して値を2次元配列に割り当てるために反復処理することによって問題を修正しました。それが空になったので、後で辞書を使用することができないように、元の辞書を反復して空にするのはなぜですか?すべての返信を歓迎します。python反復辞書emptysそれ

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'> 

編集:ここではマップを使用するコードがあります。どのようにマップを使用せずに辞書を作成するためにそれを編集するための任意の提案?

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

反復処理をそれを空にしません。他のバグがあります。 – user2357112

+0

'トランジション 'の種類は何ですか?それが辞書だと確信していますか? 'print(type(transitions))'を試して、結果を貼り付けてください。 –

答えて

1

dictを繰り返しても空ではありません。 地図反復処理を空にします。

あなたtransitions辞書を生成どこ、あなたが値に対するリストの代わりにイテレータを作成する代わりにmapのリスト内包表記を使用している必要があります:dictのオーバー

[whatever for x in thing] 

代わりの

map(lambda x: whatever, thing) 
+0

OK。ありがとう。他の人が作成したコードを分析しているので、コードの他の部分に気づいたことがあります。多分その人は持っていてはいけない。あなたが説明したように辞書を生成するコードを編集できるかどうかがわかります。あなたが提案したようにコードとパフォーマンスに違いはありますか? – te7

+0

@ te7:コードの違いは、私が上に示したような単純なものになります。パフォーマンスの違いがあります。肯定的にも否定的にも、あなたはそれらについて心配するべきではありません。基本的には、作業コードと間違ったコードのパフォーマンスを比較することは意味がありません。 – user2357112

+0

@ user2357112 [OK]をクリックします。ありがとう。私の編集を見る – te7

関連する問題