Dalam Daftar Diktik, temukan nilai min () dari bidang Diktekan yang umum

91

Saya punya daftar kamus seperti ini:

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

Saya ingin mencari harga min () dan max (). Sekarang, saya dapat mengurutkan ini dengan cukup mudah menggunakan kunci dengan ekspresi lambda (seperti yang ditemukan di artikel SO lainnya), jadi jika tidak ada cara lain saya tidak terjebak. Namun, dari apa yang saya lihat hampir selalu ada cara langsung dengan Python, jadi ini adalah kesempatan bagi saya untuk belajar lebih banyak.

Hank Fay
sumber

Jawaban:

60

Ada beberapa pilihan. Ini yang langsung:

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

[Sunting]

Jika Anda hanya ingin mengulang melalui daftar sekali, Anda dapat mencoba ini (dengan asumsi nilai dapat direpresentasikan sebagai 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)
dappawit
sumber
Saya menerima ini sebagai jawaban karena tidak hanya memberikan jawaban, tetapi juga menunjukkan kepada saya bahwa seseorang dapat mengabstraksikan urutan. Sial, Python adalah bahasa yang indah. Terima kasih!
Hank Fay
2
Jika Anda tidak memerlukan seq, dan daftarnya besar, ini bisa menjadi tidak efisien karena memori untuk seluruh daftar harus dialokasikan hanya untuk menemukan maks.
Charles L.
Ini melemparAttributeError: 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'])

Ini memberi tahu Anda tidak hanya berapa harga maksimal tetapi juga barang mana yang paling mahal.

Hugh Bothwell
sumber
4
Ah, itu sentuhan yang bagus, mengembalikan seluruh item. Tidak diperlukan dalam hal ini, tetapi sangat pasti penjaga masa depan.
Hank Fay
itulah yang saya cari. Hebat. Terima kasih!
svenwildermann
Solusi yang elegan!
anapaulagomes
2
@ thomas.mac Anda dapat mengurutkan dan kemudian memilih 5 teratas? lihat stackoverflow.com/questions/72899/…
hibernado
2
Ini bekerja dengan sempurna. Mengikuti komentar @ thomas.mac, adakah cara mudah untuk mendapatkan semua minimum jika ada beberapa (sebagai daftar dikt yang cocok, misalnya)?
Romain
40

Saya pikir ekspresi yang paling langsung (dan paling Pythonic) adalah seperti ini:

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

Hal ini menghindari overhead pengurutan daftar - dan, dengan menggunakan ekspresi generator, alih-alih pemahaman daftar - sebenarnya juga menghindari pembuatan daftar apa pun. Efisien, langsung, dapat dibaca ... Pythonic!

dcrosta.dll
sumber
8

Satu jawaban akan memetakan penis Anda ke nilai yang diinginkan di dalam ekspresi generator, dan kemudian menerapkan bawaan mindan max.

myMax = max(d['price'] for d in myList)
myMin = min(d['price'] for d in myList)
rlibby
sumber
nitpick: itu adalah ekspresi generator. Pemahaman daftar dikelilingi oleh [dan ], dan sebenarnya menghasilkan daftar Python sebagai langkah perantara.
dcrosta
@dcrosta, ya, terima kasih, tentu saja Anda benar. Saya mengubah kata-katanya karena itu memalukan.
rlibby
3

bisa juga menggunakan ini:

from operator import itemgetter

lst = [{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]  
max(map(itemgetter('price'), lst))
karton.ayun
sumber