Trong Danh sách các Hành động, hãy tìm giá trị min () của một trường Dữ liệu chung


91

Tôi có một danh sách các từ điển như vậy:

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

Tôi muốn tìm giá min () và max (). Bây giờ, tôi có thể sắp xếp điều này đủ dễ dàng bằng cách sử dụng một khóa có biểu thức lambda (như được tìm thấy trong một bài viết SO khác), vì vậy nếu không có cách nào khác, tôi không bị mắc kẹt. Tuy nhiên, từ những gì tôi đã thấy, hầu như luôn luôn có một cách trực tiếp trong Python, vì vậy đây là cơ hội để tôi tìm hiểu thêm một chút.

Câu trả lời:


60

Có một số tùy chọn. Đây là một cái nhìn thẳng:

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

[Biên tập]

Nếu bạn chỉ muốn lặp lại danh sách một lần, bạn có thể thử điều này (giả sử các giá trị có thể được biểu diễn dưới dạng 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)

Tôi chấp nhận đây là câu trả lời vì nó không chỉ đưa ra câu trả lời mà còn cho tôi thấy rằng người ta có thể trừu tượng hóa các chuỗi. Darn, Python là một ngôn ngữ đẹp. Cảm ơn!
Hank Fay

2
Nếu bạn không cần seqvà danh sách lớn, điều này có thể không hiệu quả vì bộ nhớ cho toàn bộ danh sách phải được cấp phát chỉ để tìm giá trị lớn nhất.
Charles L.

Nó némAttributeError: 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'])

Điều này cho bạn biết không chỉ giá tối đa là bao nhiêu mà còn cho biết mặt hàng nào đắt nhất.


4
Ah, đó là một liên lạc tốt, trả lại toàn bộ vật phẩm. Không cần thiết trong trường hợp này, nhưng rất chắc chắn là một thủ môn cho tương lai.
Hank Fay

đó là những gì tôi đang tìm kiếm. Tuyệt vời. Cảm ơn!
svenwildermann

Một giải pháp thanh lịch!
anapaulagomes,

2
@ thomas.mac Bạn có thể sắp xếp và sau đó chọn 5 đầu? xem stackoverflow.com/questions/72899/…
hibernado

2
Điều này hoạt động hoàn hảo. Theo nhận xét của @ thomas.mac, có cách nào dễ dàng để lấy tất cả các cực tiểu nếu có một số (ví dụ như danh sách các dict khớp) không?
Romain

40

Tôi nghĩ rằng biểu thức trực tiếp nhất (và hầu hết Pythonic) sẽ là một cái gì đó như:

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

Điều này tránh được công việc sắp xếp danh sách - và bằng cách sử dụng biểu thức trình tạo, thay vì hiểu danh sách - cũng tránh được việc tạo bất kỳ danh sách nào. Hiệu quả, trực tiếp, dễ đọc ... Pythonic!


8

Một câu trả lời sẽ là ánh xạ các lệnh của bạn với giá trị quan tâm bên trong biểu thức trình tạo, sau đó áp dụng các tích hợp minmax.

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

nitpick: đó là các biểu thức máy phát điện. Các phần hiểu danh sách được bao quanh bởi []và thực sự tạo ra một danh sách Python như một bước trung gian.
dcrosta

@dcrosta, vâng, cảm ơn bạn, tất nhiên là bạn đúng. Tôi đã thay đổi từ ngữ vì điều đó thật đáng xấu hổ.
rlibby

3

cũng có thể sử dụng cái này:

from operator import itemgetter

lst = [{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]  
max(map(itemgetter('price'), lst))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.