2016-05-09 23 views
10

Tôi đang cố trả về một giá trị chỉ số thứ hai nhỏ nhất (giá trị y) từ danh sách các bộ dữ liệu. Nếu có hai bộ dữ liệu có giá trị y thấp nhất, thì hãy chọn tuple có giá trị x lớn nhất (tức là chỉ mục đầu tiên).Trả về giá trị với giá trị y nhỏ nhất từ ​​danh sách các bộ dữ liệu

Ví dụ, giả sử tôi có tuple:

x = [(2, 3), (4, 3), (6, 9)] 

Các giá trị trả về nên (4, 3). (2, 3) là một ứng cử viên, như x[0][1]3 (giống như x[1][1]), tuy nhiên, x[0][0] nhỏ hơn x[1][0].

Cho đến nay tôi đã cố gắng:

start_point = min(x, key = lambda t: t[1]) 

Tuy nhiên, điều này chỉ kiểm tra chỉ số thứ hai, và không so sánh hai bộ dữ liệu chỉ số đầu tiên nếu chỉ số thứ hai của họ là tương đương.

+5

Bạn có thể thử một cái gì đó như: 'min (x, key = lambda t: [t [1], -t [0]])' –

Trả lời

16

Bao gồm giá trị x trong một bộ được trả về từ khóa; yếu tố thứ hai này trong khóa sẽ được sử dụng khi có giá trị cho giá trị y. Để đảo ngược vùng so sánh (từ nhỏ đến lớn), chỉ cần phủ nhận giá trị:

min(x, key=lambda t: (t[1], -t[0])) 

Sau khi tất cả, -4 nhỏ hơn -2.

Demo:

>>> x = [(2, 3), (4, 3), (6, 9)] 
>>> min(x, key=lambda t: (t[1], -t[0])) 
(4, 3) 
+0

Tại sao trừ trong '-t [0] '? Đây không phải là lời chỉ trích, tôi chỉ không hiểu nó ... –

+3

@ByteCommander: bởi vì trong một tie các * lớn hơn * 'x' giá trị nên được lựa chọn, không nhỏ hơn. –

+0

Cảm ơn bạn, hoạt động hoàn hảo. Và chỉ có một dòng yêu cầu! – Seb

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