2016-04-01 3 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

в 'time_to_intersection [key2]', key2 либо 1,3 или 2, и вы пытаетесь использовать его в качестве ключа, но они существуют только в качестве значения в preference_dict – Whitefret

+2

Это поражает меня как очень странно для моделирования этого состояния. Почему бы просто не использовать массив (список) кортежей, если у вас аллергия на реальные объекты? Например. 'state = [(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)]: 

питона поставит tuple[0] в key1 и tuple[1] в key2. Это означает, что на самой первой итерации и key2 = 1. Сразу после этого вы пишете preference_dict[key1], который равен 1 ... но preference_dict[key2], который является preference_dict[1], не существует.

+0

Его правда. Что мне делать, чтобы повторять несколько ключей в цикле, а не dict.items()? –

+0

Вы всегда можете использовать 'dict.keys()', который возвращает только список ** **. Для повторения нескольких ключей вы можете выполнить вложенный цикл: 'для key1 в dict.keys(): для key2 в dict.keys(): ...'. Я могу быть более полезным, если вы уточните, что вы хотите получить :). – Sawel

0

KeyError обычно возникает, когда вы запрашиваете словарь для ключа, который делает не существует.

В ваших cae это когда вы запрашиваете preference_dict[key2].

Это хороший пример того, насколько читаемость кода подсчитывается. Использование дополнительных пояснений имена переменных часто помогают обнаружить такие ошибки уже во время кодирования.

Ниже представлен переформатированный код с измененными именами. Он по-прежнему содержит ошибку, но должен показать, как изменяется читаемость кода.

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 
Смежные вопросы