2009-12-19 40 views
7

Có danh sách được sắp xếp và một số giá trị ngẫu nhiên, tôi muốn tìm giá trị nào trong phạm vi đó.Cách nhiệt tình để tìm giá trị giữa hai giá trị trong danh sách

Danh sách đi như thế này: [0, 5, 10, 15, 20] Và giá trị, nói 8.

Cách tiêu chuẩn sẽ là một trong hai đi từ lúc bắt đầu cho đến khi chúng đạt giá trị lớn hơn của chúng ta (như trong ví dụ bên dưới), hoặc để thực hiện binary search.

grid = [0, 5, 10, 15, 20] 
value = 8 
result_index = 0 
while result_index < len(grid) and grid[result_index] < value: 
    result_index += 1 

print result_index 

Tôi tự hỏi nếu có cách tiếp cận nhiệt tình hơn, vì điều này mặc dù ngắn, trông hơi đau mắt. Cảm ơn bạn đã dành thời gian!

Trả lời

20
>>> import bisect 
>>> grid = [0, 5, 10, 15, 20] 
>>> value = 8 
>>> bisect.bisect(grid, value) 
2 

Edit:

bisect — Array bisection algorithm

+1

+1, đánh bại tôi vào nó bằng cách mười giây. Sẽ có giá trị liên kết đến các tài liệu stdlib mặc dù. – Kiv

+0

tôi đoán tôi đã không tìm thấy các điều khoản phù hợp để tìm kiếm! Cảm ơn bạn rất nhiều, đây là chính xác những gì tôi đang tìm kiếm! –

+0

O gosh, một ngôn ngữ WET khác! :) vui để xem làm thế nào python (mặc dù bị một hệ thống kiểu cứng nhắc như Java) tuy nhiên buộc bạn phải viết tất cả mọi thứ hai lần. – akuhn

1
for min, max in zip(grid, grid[1:]): # [(0, 5), (5, 10), (10, 15), (15, 20), (20, 25)] 
    if max <= value < min: #previously: if value in xrange(min, max): 
    return min, max 
raise ValueError("value out of range") 
+0

+1 cái này cũng đẹp quá! –

+0

Điều gì sẽ xảy ra nếu 'giá trị = 2, lưới = [3, 2 ** 30]'? –

+0

Nếu lưới của bạn là '[3, 2 ** 30]' cơ hội là bạn có vấn đề tồi tệ hơn điều này. Vấn đề thực sự của giải pháp này là nó chỉ hoạt động với các giá trị số nguyên của 'giá trị'. – badp

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