Dicts Listesinde, ortak bir Dict alanının min () değerini bulun


91

Bunun gibi bir sözlük listem var:

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

Min () ve max () fiyatları bulmak istiyorum. Şimdi, lambda ifadesine sahip bir anahtar kullanarak bunu yeterince kolayca sıralayabilirim (başka bir SO makalesinde olduğu gibi), bu nedenle başka bir yol yoksa takılıp kalmam. Bununla birlikte, gördüğüm kadarıyla Python'da neredeyse her zaman doğrudan bir yol vardır, bu yüzden bu benim biraz daha fazlasını öğrenmem için bir fırsat.

Yanıtlar:


60

Birkaç seçenek var. İşte basit olanı:

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

[Düzenle]

Listeyi yalnızca bir kez yinelemek istiyorsanız, şunu deneyebilirsiniz (değerlerin ints olarak temsil edilebileceğini varsayarak ):

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)

Sadece cevabı vermekle kalmayıp aynı zamanda sekansları soyutlayabileceğimi de gösterdiği için bunu cevap olarak kabul ediyorum. Kahretsin, Python güzel bir dil. Teşekkürler!
Hank Fay

2
İhtiyacınız yoksa seqve liste büyükse, bu verimsiz olabilir, çünkü tüm listenin hafızasının sadece maks.
Charles L.

AtarAttributeError: 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'])

Bu size sadece maksimum fiyatın ne olduğunu değil, aynı zamanda hangi ürünün en pahalı olduğunu da söyler.


4
Ah, bu güzel bir dokunuş, tüm eşyayı iade etmek. Bu durumda gerekli değil, ama kesinlikle gelecek için bir koruyucu.
Hank Fay

aradığım buydu. Harika. Teşekkürler!
svenwildermann

Zarif bir çözüm!
anapaulagomes

2
@ thomas.mac Sıralayıp ilk 5'i seçebilir misiniz? bkz. stackoverflow.com/questions/72899/…
hibernado

2
Bu mükemmel çalışıyor. @ Thomas.mac'ın yorumunu takiben , birkaç tane varsa tüm minimumları elde etmenin kolay bir yolu var mı (örneğin, eşleşen bir dikt listesi olarak)?
Romain

40

Bence en doğrudan (ve en Pythonic) ifade şöyle bir şey olurdu:

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

Bu, listeyi sıralamanın ek yükünü önler - ve bir liste anlama yerine bir üretici ifadesi kullanarak - aslında herhangi bir liste oluşturmaktan da kaçınır. Etkili, doğrudan, okunabilir ... Pythonic!


8

Cevaplardan biri, diktlerinizi bir üreteç ifadesinin içindeki ilgi değerine eşlemek ve ardından yerleşik minve max.

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

nitpick: bunlar jeneratör ifadeleridir. Liste comprehensions ile çevrilidir [ve ]ve aslında bir ara adım olarak bir Python listesini oluşturacaktır.
dcrosta

@dcrosta, evet, teşekkürler, tabii haklısın. Bu utanç verici olduğu için ifadeleri değiştirdim.
rlibby

3

bunu da kullanabilir:

from operator import itemgetter

lst = [{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]  
max(map(itemgetter('price'), lst))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.