2011-08-29 73 views
19

Điều này có vẻ như là một vấn đề khá đơn giản, nhưng tôi đang tìm kiếm một cách ngắn gọn và ngọt ngào để làm điều đó mà vẫn có thể hiểu được (đây không phải là chơi gôn mã).Cách tìm chuỗi ngắn nhất trong danh sách bằng Python

Đưa ra danh sách các chuỗi, cách dễ nhất để tìm chuỗi ngắn nhất là gì?

Cách đó là rõ ràng nhất đối với tôi là khoảng:

l = [...some strings...] 
lens = map(l, len) 
minlen, minind = min(lens) 
shortest = l[minind] 

nhưng điều đó dường như rất nhiều mã cho vấn đề này (ít nhất là trong python).

Trả lời

59

The min function có thông số tùy chọn key cho phép bạn chỉ định hàm để xác định "giá trị sắp xếp" của từng mục. Chúng ta chỉ cần thiết lập này để the len function để lấy giá trị ngắn nhất:

strings = ["some", "example", "words", "that", "i", "am", "fond", "of"] 

print min(strings, key=len) # prints "i" 
+5

Làm thế nào rõ ràng! Tôi không thể tin rằng tôi đã bỏ lỡ điều này. – leecbaker

+0

Có vẻ như bạn có thể làm tối thiểu (chuỗi) vì độ dài là số phút tối thiểu sẽ sử dụng theo mặc định –

+0

@joelgoldstick: Không chính xác. Thử 'min ([" b "," aa "])'. –

0

tiềm năng câu trả lời:

l = [...some strings...] 
l.sort(key=len) 
shortest = l[0] 

Tuy nhiên, điều này có lẽ rất không hiệu quả ở chỗ nó phân loại toàn bộ danh sách, đó là không cần thiết. Chúng tôi thực sự chỉ cần tối thiểu.

1

Tôi muốn sử dụng sorted(l, key=len)[0]

+2

Đó là quá mức cần thiết. Bên cạnh khái niệm câu trả lời quá phức tạp, phân loại là 'O (n log n)' trong khi 'min' là' O (n) '. – delnan

+0

@delnan Tôi không biết nếu tôi đồng ý với "khái niệm phức tạp", nhưng tôi đồng ý sử dụng 'min' là tốt hơn nhiều (và cũng là biến thể giảm được đăng sau). – carlpett

+3

Chưa kể đến không hiệu quả đối với đầu vào lớn, nó cũng sai, trả về chuỗi _longest_ thay thế. Đã sửa lỗi ít nhất ... – carlpett

2

Mất thời gian tuyến tính:

reduce(lambda x, y: x if len(x) < len(y) else y, l) 
-1
arr=('bibhu','prasanna','behera','jhgffgfgfgfg') 
str1='' 

#print (len(str)) 
for ele in arr: 
    print (ele,ele[::-1]) 
    if len(ele)>len(str1): 
     str1=ele 
    elif len(ele)<len(str2): 
     str2=ele 
print ("the longest element is :",str1) 
str2=arr[0] 
for ele in arr: 
    if len(ele)<len(str2): 
     str2=ele 

print ("the shortest element is :",str2) 
Các vấn đề liên quan