如何对值进行排序,并将其直接按降序放入for循环本身的数组中,而不是在for循环之后使用sorted函数?
final_lst = []
for row in data:
score = function_returns_a_score()
final_lst.append({"score": score})
print(final_lst)
# returns
# [{"score": 10}, {"score": 40}, {"score": 90}, {"score": 15}]
print(sorted(final_lst, key=lambda k: k['score'], reverse=True))
# returns
# [{'score': 90}, {'score': 40}, {'score': 15}, {'score': 10}]
只需在循环后对数组进行排序:
final_lst = []
for row in data:
score = function_returns_a_score()
final_lst.append({"score": row})
final_list.sort(key=lambda k: k["score"], reverse=True)
print(final_lst)
# returns
# [{'score': 90}, {'score': 40}, {'score': 15}, {'score': 10}]
如果出于任何原因,您真的想维护一个排序列表,那么可以考虑使用PriorityQueue
和一个包装对象的类来实现自定义比较函数。
您可以创建一个反向bisect
函数来获取正确的插入索引。
借用这个答案的密码
def reverse_bisect(a, x, lo=0, hi=None):
"""Return the index at which x could be inserted in a assuming a
is reverse-sorted.
Optional args lo (default 0) and hi (default len(a)) bound the
slice of a to be searched.
"""
if lo < 0:
raise ValueError('lo must be non-negative')
if hi is None:
hi = len(a)
while lo < hi:
mid = (lo+hi)//2
if x > a[mid]: hi = mid
else: lo = mid+1
return lo
scores = []
for row in data:
score = function_returns_a_score()
idx = reverse_bisect(scores, score) # this is the correct index to insert the value
scores.insert(idx, score)
final_lst = [{"score": score} for score in scores]
复杂性分析:(取N=数组中的元素数)
排序需要O(NlogN)
时间。二进制搜索的时间复杂度为O(logN)
。为每个元素调用N
次,使其再次运行O(NlogN)
次。除此之外,N
在开始时更小。
空间复杂性:O(N)
您在这里占用了额外的空间来存储值,因此您可能也必须考虑到这一点。
下面的答案适用于希望按“正常”(而非相反)顺序插入值的人。
要在正确的索引处插入分数,首先需要知道正确的索引。如果列表被排序(一个空的lit被排序),我们可以使用二进制搜索
找到正确的索引来插入一个元素。
您可以使用对分
模块找到需要插入分数的索引。
import bisect
final_lst = []
scores = []
for row in data:
score = function_returns_a_score()
idx = bisect.bisect(scores, score) # this is the correct index to insert the value
final_lst.insert(idx, {"score": score})
scores.insert(idx, score)
可以使用堆队列:
import random
import heapq
final_list = []
for score in random.sample(range(100), 20): # in random order
# negative because we're sorting in reverse order
heapq.heappush(final_list, -score)
final_list = [{'score': -heapq.heappop(final_list)} for _ in range(len(final_list))]
样本结果:
[{'score': 95}, {'score': 94}, {'score': 89}, {'score': 72}, {'score': 71}, {'score': 65}, {'score': 60}, {'score': 58}, {'score': 51}, {'score': 50}, {'score': 45}, {'score': 44}, {'score': 36}, {'score': 35}, {'score': 33}, {'score': 26}, {'score': 25}, {'score': 18}, {'score': 6}, {'score': 3}]
我不确定这是否比排序更复杂,但它可以让您随时按排序顺序提取数据:您可以调用heapq。heappop(final_list)
当你需要下一个值时——相反,排序是此时此地完成的。
此外,如果你的分数是固定宽度的整数(例如,从0到100的整数),你可以使用基数排序,在这种情况下,它将是O(3n)
。
本文向大家介绍将参数放入MySQL IN()后,按降序对列进行排序?,包括了将参数放入MySQL IN()后,按降序对列进行排序?的使用技巧和注意事项,需要的朋友参考一下 为此,将方法与DESC一起使用。让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 输出结果 这将产生以下输出- 以下是在MySQL中放置参数后按降序对列进行排序的查询- 输出结果
问题内容: 可以按升序对它进行排序: 如何按降序排列? 问题答案: 要以相反顺序排序,请将作为参数传递给。 要获取a ,您必须明确要求使用4参数。如果您未指定所需的地图类型,则将获得默认值,而默认值是。由于不保留元素的顺序,因此绝对不会为您服务。 使用静态导入,它将变得更加令人愉快:
我对这件事还不熟悉,很困惑。
考虑下面的哈希图: 具有诸如 我需要按值对hashmap进行降序排序,但如果值相等,则按键进行升序排序: 到目前为止,我试着分别按键排序,然后按值排序,但我不相信这种方法。除了创建更多的hashmaps之外,还有什么好方法呢?
我有数据。表中有大约300万行和40列。我希望在组内按降序对该表排序,如以下sql模拟代码: 数据中是否存在等效的方法。这张桌子可以吗?到目前为止,我必须将其分解为两个步骤: 这非常快,只需要几秒钟。 这一步需要更长的时间(5分钟)。 更新:有人评论要执行<code>X 我的方法是:setkey()然后是order(-Month) 我现在的问题是:如果我想按年、MemberId和一个又一个排序(年
问题内容: 如何按“订单”键的值对该数组排序?即使这些值当前是连续的,也不会总是如此。 问题答案: 尝试使用usort,如果您仍然使用PHP5.2或更早版本,则必须首先定义一个排序函数: 从PHP 5.3开始,您可以使用匿名函数: 最后,在PHP 7中,您可以使用spaceship运算符: 要将其扩展到多维排序,如果第二个/第三个排序元素为零,请参考第二个/第三个排序元素-下文将详细说明。您也可以