python - 서로 상대적인 Python 필터 목록 항목

출처 python list filter filtering

튜플 목록이 있다고 가정 해 보겠습니다.

fruits = [('apple','red',23),
          ('apple','green',12),
          ('orange','small',12),
          ('orange','large',1)]


숫자가 가장 크지 만 과일 이름에 고유 한 튜플을 사용하여 새 목록을 빠르고 깔끔하게 만들려면 어떻게해야합니까? 따라서 이상적인 결과는 다음과 같습니다.

fruits = [('apple','red',23),
          ('orange','small',12)]


내 현재 방법은 다음과 같습니다.

def check_fruit(fruit, a_list):
    for item in a_list:
        if fruit[0] == item[0] and fruit[2] < item[2]:
            return False
    return True
filtered_list = [fruit for fruit in fruits if check_fruit(fruit, fruits)]


더 좋은 방법이 있으면 알려주세요! 감사.
fruits 목록이 이미 과일별로 정렬되어 있으면 itertools.groupby를 사용하십시오.

from itertools import groupby
from operator import itemgetter

def fruitfilter(fruits):
    for fruit, group in groupby(fruits, key=itemgetter(0)):
        yield max(group, key=itemgetter(2))

fruits = list(fruitfilter(fruits))


간단히 말해서 발전기없이 :

[max(group, key=itemgetter(2)) for fruit, group in groupby(fruits, itemgetter(0))]


그러나 fruits wholesale을 대체하지 않고 발전기를 사용할 수 있습니다.

그렇지 않으면 sorted(fruits, key=(itemgetter(0), -itemgetter(2))를 사용하고 groupby를 사용하여 각 그룹의 첫 번째 항목을 가져옵니다.

def fruitfilter(fruits):
    sortedfruits = sorted(fruits, key=(itemgetter(0), -itemgetter(2)))
    for fruit, group in groupby(sortedfruits, key=itemgetter(0)):
        yield next(group)

fruits = list(fruitfilter(fruits))
관련 기사

python - 비 루트 사용자로서의 감독자 [닫힘]

python - REST API의 일반 (HTML이 아닌) 오류 페이지

python - 지정된 바이트 오프셋에서 파일에서 행 가져 오기

python - 파이썬의 백 슬래시 이스케이프 문자 이해

python - Simplegui 가져 오기 문제

python - 한 번에 여러 파일 쓰기

python - 최소 차 제곱합을 찾는 알고리즘

python - Python에서 베어 함수 객체가 유효한 코드 인 이유는 무엇입니까? [닫은]

python - 예외에서 루프를 종료하지만 모든 예외 유형을 다시 발생시키지 않는 방법은 무엇입니까?

python - 특수 문자를 고려하지 않고 대소 문자를 구분하지 않고 문자열 목록을 정렬하는 방법