2015-05-30 26 views
6

Tôi đang cố gắng để có được những chỉ số của từ điển với max 'size' trong một danh sách các từ điển như sau:Python danh sách dicts, nhận được giá trị tối đa chỉ số

ld = [{'prop': 'foo', 'size': 100}, {'prop': 'boo', 'size': 200}] 

với đoạn mã sau tôi có thể mất kích thước tối đa:

items = [x['size'] for x in ld] 
print max(items) 

Tôi có thể lấy chỉ mục ngay bây giờ bằng cách nào? Có đường nào dễ đi không?

Test:

tôi chỉ figured tôi có thể làm điều đó:

items = [x['size'] for x in ld] 
max_val = max(items) 
print items.index(max_val) 

là nó có đúng không?

Trả lời

11

Nói max() làm thế nào để tính toán tối đa cho một chuỗi các chỉ số:

max(xrange(len(ld)), key=lambda index: ld[index]['size']) 

này sẽ trả lại chỉ số mà chìa khóa size là cao nhất:

>>> ld = [{'prop': 'foo', 'size': 100}, {'prop': 'boo', 'size': 200}] 
>>> max(xrange(len(ld)), key=lambda index: ld[index]['size']) 
1 
>>> ld[1] 
{'size': 200, 'prop': 'boo'} 

Nếu bạn muốn mà từ điển tất cả cùng, sau đó bạn chỉ có thể sử dụng:

max(ld, key=lambda d: d['size']) 

và để có được cả hai chỉ số từ điển, bạn có thể sử dụng enumerate() đây:

max(enumerate(ld), key=lambda item: item[1]['size']) 

Một số demoing hơn:

>>> max(ld, key=lambda d: d['size']) 
{'size': 200, 'prop': 'boo'} 
>>> max(enumerate(ld), key=lambda item: item[1]['size']) 
(1, {'size': 200, 'prop': 'boo'}) 

Chức năng key được truyền mỗi phần tử trong chuỗi đầu vào lần lượt và max() sẽ chọn phần tử trong đó giá trị trả về của hàm key là cao nhất.

Sử dụng danh sách riêng để trích xuất tất cả các giá trị size sau đó ánh xạ trở lại danh sách ban đầu của bạn không hiệu quả lắm (bây giờ bạn cần lặp lại danh sách hai lần). list.index() không thể hoạt động vì nó phải khớp với toàn bộ từ điển, không chỉ một giá trị trong đó.

+0

Cám ơn bạn trả lời, tôi đã thêm một số nội dung, bạn nghĩ gì về? Tôi cần một giải pháp dễ dàng hơn. Của bạn là tuyệt vời nhưng một dễ hiểu hơn sẽ được tốt đẹp! – Kvash

+1

Tôi đang học rất nhiều từ câu trả lời của bạn. Cảm ơn cho nó. – Kvash

3

Bạn có thể vượt qua enumerate(ld)-max chức năng với một chìa khóa thích hợp:

>>> max(enumerate(ld),key=lambda (x,y):y['size'])[0] 
1 
Các vấn đề liên quan