Как мы можем отсортировать список объектов по значению атрибута каждого объекта?

#python #pulp

#python #целлюлоза

Вопрос:

У меня есть объект списка, который выглядит в отладчиках следующим образом:

введите описание изображения здесь

Как вы можете видеть, элементы списка упорядочены в алфавитном порядке. То есть по индексу 02 он имеет элемент 10 , а 2 не . Также обратите внимание, что каждый элемент на самом деле является объектом типа pulp.pulp.LpVariable , а число, которое мы видим в списке, на самом деле является значением name свойства каждого объекта (как видно из последнего списка изображения). Pulp, похоже, сортирует свои переменные в алфавитном порядке.

Я хочу, чтобы этот список был отсортирован численно по имени каждого объекта. То есть я хочу 2 по индексу 2 , 3 по индексу 3 и так далее.

Я попробовал ниже:

 >>> from pulp import *
>>> prob = LpProblem("lp", LpMinimize)
>>> dvs = {}
>>> for i in range(20):
...     dvs[i]=LpVariable(str(i))
... 
>>> prob  = lpSum(dvs.values())
>>> prob.variables()
[0, 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 3, 4, 5, 6, 7, 8, 9]
>>> prob.variables().sort(key=lambda x:int(x.name))
>>> prob.variables()
[0, 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 3, 4, 5, 6, 7, 8, 9]
  

Как вы можете видеть, сортировка просто не происходит. Я ожидал, что вывод в последней строке будет:

 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
  

Как я могу это сделать?

Ответ №1:

Я не знаю, что prob.variables() это значит, но тот факт, что is является вызываемым, заставляет меня сильно подозревать, что вы не ссылаетесь на один и тот же список при его сортировке и при его печати, но получаете новый список при каждом вызове prob.variables()

Пожалуйста, попробуйте следующее:

 result = sorted(prob.variables(), key=lambda x:int(x.name))
print(result)