Выполните итерацию по словарю python и добавьте ключевой компонент в два списка

#python #python-3.x #list #dictionary

#питон #python-3.x #Список #словарь

Вопрос:

У меня есть следующий словарь, tempDict

 {('M1', 'P1'): 6.0,  ('M1', 'P2'): 10.0,  ('M1', 'P3'): 4.0,  ('M2', 'P1'): 7.0,  ('M2', 'P2'): 9.0,  ('M2', 'P3'): 5.0}  

Я выполняю некоторые операции над этим словарем и беру некоторые ключевые компоненты в список. Скажи, что у меня есть l1 = [], l2 = [] .

Предположим, минимальное значение равно 4, я нахожу это jobsR as ('M1', 'P3') .Я хотел бы удалить все ключи, где появляется «P3», из tempDict.

Я буду находить минимальное значение из этого словаря итеративно и отброшу соответствующие ключи. Поскольку ключи упорядочены парами, если отправленный ключевой элемент имеет 1-й компонент M1 , то я возьму 2-й компонент в списке l1 еще внутри l2 . Я буду продолжать до тех пор, пока словарь не опустеет. Мой код таков,

 while bool(tempDict):  try:  l1 = []  l2 = []  valMin = min(tempDict.values())  jobsR = [key for key in tempDict if tempDict[key] == valMin]  for (x, y) in jobsR:  if x == 'M1':  l1.append(y)  else:  l2.append(y)  remove_list = []  for key, value in tempDict.items():  if jobsR[0][1] in key[1]:  remove_list.append(key)  for item in remove_list:  tempDict.pop(item)  except KeyError:  print('The dictionary has no item now...')  break  

Ожидаемый результат:

l1 = [P3, P1] and l2 = [P2]

Обновлен код

 l1 = [] l2 = [] while bool(tempDict):  valMin = min(tempDict.values())  jobsR = [key for key in tempDict if tempDict[key] == valMin]  remove_list = []  for key, value in tempDict.items():  if jobsR[0][1] in key[1]:  remove_list.append(key)  for item in remove_list:  tempDict.pop(item)  for x in jobsR:  #print(x[0])  if x[0] == 'M1':  l1.append(item[1])  else:  l2.append(item[1])  

Ответ №1:

списки l1 и l2 устанавливаются в [ ] в каждом цикле цикла while. Объявите l1 и l2 вне цикла while, чтобы получить ожидаемый результат.

Ответ №2:

Вам нужно брать l1 и l2 выходить из цикла while и нажимать клавиши на ходу:

 l1 = [] l2 = [] while tempDict:  min_val = min(tempDict.values())  jobsR = [k for k,v in tempDict.items() if v==min_val][0]  if jobsR[0] == 'M1':  l1.append(jobsR[1])  else:  l2.append(jobsR[1])  for k in tempDict:  if k[1]==jobsR[1]]:  tempDict.pop(k)  

Выход:

 # l1 = ['P3', 'P1'] # l2 = ['P2']  

Примечание: Это предполагает, что каждое минимальное значение имеет уникальный ключ.