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.

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)

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.


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!


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)

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))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.