Dict 목록에서 공통 Dict 필드의 min () 값을 찾습니다.


91

다음과 같은 사전 목록이 있습니다.

[{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]

min () 및 max () 가격을 찾고 싶습니다. 이제 람다식이있는 키를 사용하여 쉽게 정렬 할 수 있습니다 (다른 SO 문서에서 찾을 수 있음). 다른 방법이 없다면 멈춰 있지 않습니다. 그러나 제가 본 것에는 거의 항상 파이썬에 직접적인 방법이 있습니다. 그래서 이것은 제가 조금 더 배울 수있는 기회입니다.

답변:


60

몇 가지 옵션이 있습니다. 다음은 간단합니다.

seq = [x['the_key'] for x in dict_list]
min(seq)
max(seq)

[편집하다]

목록을 한 번만 반복하려는 경우 다음을 시도 할 수 있습니다 (값이 ints 로 표시 될 수 있다고 가정 ).

import sys

lo,hi = sys.maxint,-sys.maxint-1
for x in (item['the_key'] for item in dict_list):
    lo,hi = min(x,lo),max(x,hi)

나는 이것이 답을 줄뿐만 아니라 시퀀스를 추상화 할 수 있다는 것을 보여주기 때문에 이것을 답으로 받아들입니다. 젠장, 파이썬은 아름다운 언어입니다. 감사!
Hank Fay 2011 년

2
을 필요로하지 않고 seq목록이 큰 경우 전체 목록에 대한 메모리를 할당해야 최대 값을 찾을 수 있으므로 비효율적 일 수 있습니다.
Charles L.

그것은 던져AttributeError: module 'sys' has no attribute 'maxint'
Suncatcher

229
lst = [{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]

maxPricedItem = max(lst, key=lambda x:x['price'])
minPricedItem = min(lst, key=lambda x:x['price'])

이것은 최대 가격이 얼마인지뿐만 아니라 어떤 품목이 가장 비싼 지 알려줍니다.


4
아, 전체 항목을 반환하는 좋은 터치입니다. 이 경우에는 필요하지 않지만 미래를위한 보관 인입니다.
Hank Fay 2011 년

그게 제가 찾던 것입니다. 대박. 감사!
svenwildermann 2014-06-26

우아한 솔루션!
anapaulagomes

2
@ thomas.mac 정렬 한 다음 상위 5 개를 선택할 수 있습니까? stackoverflow.com/questions/72899/…
hibernado

2
이것은 완벽하게 작동합니다. thomas.mac의 코멘트 @에 따라 얻을 수있는 쉬운 방법이 모두 몇 가지가있는 경우 최소값은 (DICT 일치의 목록으로, 예를 들어,)?
Romain

40

나는 가장 직접적인 (그리고 대부분의 Pythonic) 표현은 다음과 같을 것이라고 생각합니다.

min_price = min(item['price'] for item in items)

이렇게하면 목록을 정렬하는 오버 헤드를 피할 수 있습니다. 목록 이해력 대신 생성기 표현식을 사용하면 실제로 목록을 만들지 않아도됩니다. 효율적이고 직접적이며 읽기 쉬운 ... Pythonic!


8

한 가지 대답은 생성기 표현식 내에서 관심있는 값에 사전을 매핑 한 다음 내장 minmax.

myMax = max(d['price'] for d in myList)
myMin = min(d['price'] for d in myList)

nitpick : 생성기 표현식입니다. 목록 이해는 [및 로 둘러싸여 ]있으며 실제로 중간 단계로 Python 목록을 생성합니다.
dcrosta 2011 년

@dcrosta, 예, 감사합니다. 물론 맞습니다. 부끄러워서 문구를 바꿨습니다.
rlibby 2011 년

3

이것을 사용할 수도 있습니다.

from operator import itemgetter

lst = [{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]  
max(map(itemgetter('price'), lst))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.