You could use a heap queue:
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))]
Sample result:
[{'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}]
I'm not sure that this would have better complexity than sorting, but it lets you extract the data in sorted order whenever you want: you can call heapq.heappop(final_list)
when you need the next value - sorting, on the contrary, is done here and now.
Also, iff your scores are fixed-width integers (say, integers from 0 to 100), you could use the radix sort which would be O(3n)
in this case.