Làm thế nào để tìm mục trong danh sách có f (mục) nhỏ nhất?


10

Tôi có một danh sách, lvà một chức năng f. fkhông nghiêm túc tăng hay giảm. Làm thế nào tôi có thể tìm thấy các mục trong danh sách f(item)nhỏ nhất? Ví dụ: giả sử danh sách là:

l = [1, 2, 3, 4]

list(f(x)for x in l)là:

[2, 9, 0, 3]

f(3)nhỏ hơn f của bất kỳ cái nào khác, vì vậy nó nên in "3". Cách ngắn nhất để làm điều này là gì? Tôi đã thử ban đầu:

min(f(x) for x in l)

Nhưng điều này cho 0, không 3. Nếu tôi chụp để dễ đọc chứ không phải ngắn gọn, tôi sẽ làm:

index = 0
smallest = f(l[0])
for i in range(len(l)):
    value = f(l[i])
    if value < smallest:
        smallest = value
        index = i

Điều này là tốt, nhưng khủng khiếp cho mã golf. Ngay cả khi nó được đánh golf

i,s=0,f(l[0])
for x in range(len(l)):
 v=f(l[x])
 if v<s:s,i=v,x

Đây là một giải pháp tồi. Giải pháp ngắn nhất tôi có thể nghĩ đến là:

g=[f(x)for x in l];print(l[g.index(min(g))])

(44 byte) Làm thế nào tôi có thể đánh gôn này xuống hơn nữa?


8
Chỉ cần min(l,key=f).
vaultah 17/05/2016

2
@vaultah Đăng đó là một câu trả lời.
NoOneIsHere 17/05/2016

4
@ KevinLau-notKenny Đây là một câu hỏi mẹo . Đó là về chủ đề.
NoOneIsHere 17/05/2016

2
@trichoplax thực sự tôi nghĩ đây là cái này: meta.codegolf.stackexchange.com/a/1724/31625
FryAmTheEggman

2
Đây là một chủ đề thú vị. Có lẽ làm cho nó chung chung, không giới hạn với Python? Thật thú vị khi xem làm thế nào để làm điều đó bằng các ngôn ngữ khác nhau
Luis Mendo

Câu trả lời:


10

Sử dụng keytài sản củamin

Như @vaultah đã nói, hãy sử dụng min(l,key=f). min(l,key=f)mất tối thiểu f(i)cho itrong l.

Cũng có thể áp dụng điều này cho max, và sorted. Ví dụ, max(l,key=f)là tối đa f(i)cho itrong l. Đối với sorted, việc sử dụng sẽ là : sorted(l,key=f).


1
Tôi chấp nhận điều này ngay bây giờ, nhưng sẽ chấp nhận câu trả lời từ @vaultah nếu anh ấy đăng nó.
James
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.