#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']
Примечание: Это предполагает, что каждое минимальное значение имеет уникальный ключ.