2016-04-01 22 views
0

私は交差点をモデル化しようとしています。以下は私が書いたコードです。交差点までの時間に基づいて、私は各車両に好みを与えました。衝突をチェックするには、交差点を占める車両間の時間差を10秒にします。このコードを実行すると、それは私に "KeyError:1"を与えます。誰かが助けてくれましたか?Pythonで辞書を操作する

number_of_vehicles = 3 
preference_dict = {'Vehicle1':1, 'Vehicle2': 3, 'Vehicle3':2} 

time_to_intersection = {'Vehicle1':64, 'Vehicle2':72, 'Vehicle3': 69} 

preference = 1 
while preference < number_of_vehicles: 

    for key1,key2 in preference_dict.items(): 
     if preference_dict[key1] == preference and preference_dict[key2] == preference+1: 
      if time_to_intersection[key1] > time_to_intersection[key2]: 
       time_to_intersection[key2]+=50*preference 
      time_diff = time_to_intersection[key2] - time_to_intersection[key1] 
      print "The time diff is:",time_diff 
      if time_diff < 10: 
       time_to_intersection[key2] +=50 
    print time_to_intersection 
    preference+=1 
+1

、KEY2は1,3または2のいずれかで、あなたがキーとしてそれを使用しようとしたが、彼らは非常に奇妙な方法として私を打つpreference_dict – Whitefret

+2

の値として存在していますこの状態をモデル化する。なぜ実際のオブジェクトにアレルギーがあるのであれば、タプルの配列(リスト)を使用するだけではありませんか?例えば。 '状態= [(1,64)、(3,72)、(2,69)]'または何か。私は "嗜好"のポイントを理解しているかどうか分からないが、私はあなたが持っていた価値を保った。 – unwind

+0

交点に到達するのに最低限の時間が必要な車両には、最初の優先度が与えられます。 –

答えて

3

dict.items()関数は、タプルのリストを返します。各タプルは(key, value)タプルです。 あなたが書く:

for key1, key2 in preference_dict.items(): 

実際に何が書かれたことは次のとおりです。

for key1, key2 in [('Vehicle1', 1), ('Vehicle2', 3), ('Vehicle3', 2)]: 

Pythonの自動アンパックはkey2key1tuple[1]tuple[0]を入れます。 つまり、最初の繰り返しではとkey2 = 1です。 直後にpreference_dict[key1]は1 ...と書かれていますが、preference_dict[1]preference_dict[key2]は存在しません。

+0

その真です。 dict.items()の代わりにループ内の複数のキーを反復するにはどうしたらよいですか? –

+0

**キー**のリストだけを返す 'dict.keys()'をいつでも使うことができます。複数のキーを繰り返し処理するには、for dict.keys()のkey1に対して:for dict.keys()のkey2のためにネストされたforループを実行できます。私はあなたが何をしたいのかを明確にするならば、もっと役に立ちます。 – Sawel

0

KeyError通常、辞書にキーを要求すると、 は存在しません。

あなたのお名前はpreference_dict[key2]です。

これは、コードの可読性がどのように評価されるかの良い例です。より多くの説明変数名を使用すると、コード化中にこのようなエラーを検出するのに役立ちます。

以下は、名前が変更された再フォーマットされたコードです。これにはまだエラーが含まれていますが、 は、コードの可読性がどのように変化するかを示します。 `time_to_intersection [キー2]`で

number_of_vehicles = 3 
pref_dct = {'Vehicle1': 1, 'Vehicle2': 3, 'Vehicle3': 2} 

time_to_intersection = {'Vehicle1': 64, 'Vehicle2': 72, 'Vehicle3': 69} 

pref = 1 
while pref < number_of_vehicles: 

    for veh_name, veh_pref in pref_dct.items(): 
     if pref_dct[veh_name] == pref and pref_dct[veh_pref] == pref+1: 
      if time_to_intersection[veh_name] > time_to_intersection[veh_pref]: 
       time_to_intersection[veh_pref] += 50 * pref 
      time_diff = (time_to_intersection[veh_pref] - 
         time_to_intersection[veh_name]) 
      print "The time diff is:", time_diff 
      if time_diff < 10: 
       time_to_intersection[veh_pref] += 50 
    print time_to_intersection 
    pref += 1 
関連する問題