개발하자
Python에서 for 루프의 상위 결과 목록을 유지하는 방법
Cuire
2023. 3. 23. 01:25
반응형
Python에서 for 루프의 상위 결과 목록을 유지하는 방법
나는 ~10,000개의 아이템 목록을 반복하고 있다. 모든 품목에 대해, 나는 그것을 처리하고 가치를 얻는다. 이름과 상위 10개의 값이 있는 튜플 목록을 값의 내림차순으로 반환하고 싶습니다.
다음과 같이 보입니다:
top_tuples = []
for item in itemlist:
cur_value = compute_value(item)
my_tuple = (item, cur_value)
if cur_value is > the smallest value on my list:
remove smallest value from top_tuples
add tuple to top_tuples at appropriate index #index is based on value
감사해요.
편집
이 오래된 답변에 대한 코멘트를 받은 후, 나는 내가 제시한 해결책이 정말 좋지 않다는 것을 깨달았다. OP가 요청한 것을 하는 더 좋은 방법은 최대 크기가 고정된 힙을 사용하는 것이다. 유일한 요구 사항은 항목 값을 튜플에 먼저 넣고 부정하는 것이다(파이썬 힙은 "최소 힙"이기 때문이다).
import heapq
NUM_TOP = 10
top_tuples = []
for item in itemlist:
cur_value = compute_value(item)
my_tuple = (-cur_value, item)
if len(top_tuples) < NUM_TOP:
heapq.heappush(top_tuples, my_tuple)
else:
heapq.heappushpop(top_tuples, my_tuple)
힙은 목록에 불과하지만 값별로 순차적으로 정렬되지 않습니다. 힙을 다음과 같이 올바른 항목 값을 사용하여 상위 요소의 정렬된 목록으로 변환할 수 있습니다:
top_tuples_sorted = []
while top_tuples:
neg_item_value, item = heapq.heappop(top_tuples)
top_tuples_sorted.append((item, -neg_item_value))
프로세스에서 힙을 비우지 않으려면 먼저 힙을 복사하거나 를 사용하여 순차적으로 정렬된 새 목록을 가져올 수 있습니다:
top_tuples_sorted = sorted((item, -neg_item_value for neg_item_value, item in top_tuples), key=lambda a: -a[1])
이전 답변
사용해 보십시오:
from operator import itemgetter
tuples_gen = ((item, compute_value(item)) for item in itemlist)
top_tuples = sorted(tuples_gen, key=itemgetter(1), reverse=True)[:10]
품목 게터 미포함:
tuples_gen = ((item, compute_value(item)) for item in itemlist)
top_tuples = sorted(tuples_gen, key=lambda tup_gen: tup_gen[1], reverse=True)[:10]
반응형