#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