반응형
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]
반응형
'개발하자' 카테고리의 다른 글
os.startfile(), Python 3.6을 사용하여 연 파일을 닫는 방법 (0) | 2023.03.24 |
---|---|
키보드가 나타나면 이동 위젯의 크기가 조정됩니다. 어떻게 이것을 예방할 수 있을까요? (0) | 2023.03.23 |
주피터 서버가 충돌했습니다. 연결할 수 없습니다. 주피터의 오류 코드: 1" (0) | 2023.03.22 |
다음의 Typescript 파일 이후 Vercel에서 빌드 오류가 발생했습니다.JS 이름 변경 (0) | 2023.03.21 |
svelt 스토어 내에서 반응성 $ 변수를 참조하는 방법은 무엇입니까? (0) | 2023.03.21 |