2012-10-30 42 views
42

thể trùng lặp:
Sorting or Finding Max Value by the second element in a nested list. PythonTìm giá trị lớn nhất trong một danh sách các bản ghi trong Python

tôi có một danh sách với ~ 10^6 bản ghi trong nó như thế này:

[(101, 153), (255, 827), (361, 961), ...] 
^ ^
    X  Y 

Tôi muốn tìm giá trị tối đa của các Y trong danh sách này, nhưng cũng muốn biết X mà nó được ràng buộc.

Làm cách nào để thực hiện việc này?

Trả lời

92

Sử dụng max():


Sử dụng itemgetter():

In [53]: lis=[(101, 153), (255, 827), (361, 961)] 

In [81]: from operator import itemgetter 

In [82]: max(lis,key=itemgetter(1))[0] #faster solution 
Out[82]: 361 

sử dụng lambda:

In [54]: max(lis,key=lambda item:item[1]) 
Out[54]: (361, 961) 

In [55]: max(lis,key=lambda item:item[1])[0] 
Out[55]: 361 

timeit so sánh:

In [30]: %timeit max(lis,key=itemgetter(1)) 
1000 loops, best of 3: 232 us per loop 

In [31]: %timeit max(lis,key=lambda item:item[1]) 
1000 loops, best of 3: 556 us per loop 
+4

(+1) sẽ 'operator.itemgetter (1)' sẽ hoạt động tốt hơn lambda trong trường hợp này bởi vì lambda sẽ được tạo cho mỗi 10 ** 6 lần. – inspectorG4dget

+0

@ inspectorG4dget sắp sửa đăng bài đó. :) –

+0

@AshwiniChaudhary: có chênh lệch tốc độ đáng kể giữa 'operator.itemgetter' và' lambda' trong các trường hợp như vậy không? – inspectorG4dget

0

Bạn có thể lặp qua danh sách và giữ tuple trong một biến và sau đó bạn có thể thấy cả hai giá trị từ biến cùng ...

num=(0, 0) 
for item in tuplelist: 
    if item[1]>num[1]: 
    num=item #num has the whole tuple with the highest y value and its x value 
+0

Tôi nghĩ 'max()' dễ hơn rất nhiều. –

+0

@BurhanKhalid Yeah, nhưng đã được đăng trong khi tôi đang viết bài của tôi. Tôi không nghĩ về điều đó. Tôi sẽ chỉnh sửa nó để không nói điều đó nữa, nhưng giữ bài viết của tôi chỉ để có một cách khác để làm điều đó cho hậu thế. :) – CoffeeRain

4

Ngoài max, bạn cũng có thể sắp xếp:

>>> lis 
[(101, 153), (255, 827), (361, 961)] 
>>> sorted(lis,key=lambda x: x[1], reverse=True)[0] 
(361, 961) 
+0

Không phải là sắp xếp ~ O (n log n) và tìm kiếm tối đa O (n)? - Tốt hơn là tìm trực tiếp tối đa –

Các vấn đề liên quan