Python получает индекс списка классов при условии

#python-3.x #sorting

#python-3.x #сортировка

Вопрос:

У меня есть следующий код:

 import numpy as np
np.random.seed(1)
class Order:
    def __init__(self, amount, orderId):
        self.orderId = orderId
        self.amount = amount 
        

n = 5
amounts = np.random.randint(low=8, high=20, size=n)
orderIds = np.arange(n)

orders = [Order(amounts[i],orderIds[i]) for i in range(n)]
  

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

Пример:

 orderIds = [0, 1, 2, 3, 4]
amounts = [15, 18, 19, 16, 10]
descending_ordered_amounts = [19, 18, 16, 15, 10]
cumsum = [19, 37, 52, 68, 78]
threshold = 55
cumsum > threshold # [False, False, False, True, True]
  

Тогда я хотел бы получить Ids = [0,4]

Какой был бы самый быстрый способ получить это, пожалуйста?

Ответ №1:

Основная проблема здесь заключается в сортировке идентификаторов по значениям, чтобы вы знали, что возвращать. Это можно сделать примерно так, используя промежуточное значение для хранения кортежа сумм и идентификаторов.

 orderIds = [0, 1, 2, 3, 4]
amounts = [15, 18, 19, 16, 10]

des = [(x, y) for x, y in zip(amounts, orderIds)]
des.sort(key=lambda x: x[0], reverse=True)

sortedIds = np.array([x[1] for x in des])
threshold = 55
ids = np.cumsum([x[0] for x in des]) > threshold

print(sortedIds[ids])
  

это выведет идентификаторы, удовлетворяющие требованию. я не использовал переменную descending_ordered_amounts, поскольку она хранится в первом столбце des, поэтому я просто использовал понимание списка в cumsum