본문 바로가기

개발하자

Python에서 for 루프의 상위 결과 목록을 유지하는 방법

반응형

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]

반응형