2013-08-31 27 views
5

Tôi có một danh sách: sốTìm nếu một số tồn tại giữa một loạt các con số được xác định bởi một danh sách

timestamp_list = ['1377091800', '1377093000', '1377094500', '1377095500'] 

Target:

ptime = 1377091810 

Tôi muốn tìm giữa mà cặp dấu thời gian làm ptime nằm trong. Ví dụ trong trường hợp này, nó nằm giữa dấu thời gian đầu tiên và thứ hai. Vì vậy, tôi muốn trả lại giá trị 1377091800 làm đầu ra mong muốn. Tương tự, nếu ptime1377091520, thì tôi muốn trả lại dấu thời gian thứ ba tức là 1377091500 vì nó nằm giữa dấu thời gian thứ ba và thứ tư.

Mã của tôi:

timestamp_list = ['1377091800', '1377093000', '1377094500', '1377095500'] 
ptime = 1377091810 
for idx, value in enumerate(timestamp_list): 
    val = long(value) 
if idx!= len(timestamp_list)-1 and ptime >= val and ptime < long(timestamp_list[idx+1]): 
    target = val 
    break 
elif (idx == len(timestamp_list)-1) and ptime >= val: 
    target = val 
else: 
    pass 
print target 

Output: 1377091800

tôi muốn biết là có bất kỳ giải pháp thanh lịch này? Kể từ khi tôi chỉ mới bắt đầu với python, tôi chưa quen với tất cả các chức năng trong python.

Mọi trợ giúp đều được đánh giá cao.

EDIT:

GIẢI PHÁP SỬ DỤNG:

import bisect 
timestamp_list = ['1377091800', '1377093000', '1377094500', '1377095500'] 
ptime = str(1377093110) 
if ptime in timestamp_list: 
    target = ptime 
else: 
    index = bisect.bisect_right(timestamp_list, ptime)-1 
    target = timestamp_list[index] 
print target 

OUTPUT:

1377093000 
+0

là danh sách được sắp xếp dấu thời gian? –

+0

Một cái gì đó như '[x cho x trong tsl nếu x <= ptime] [-1]'? – Hyperboreus

+0

@MartijnPieters có danh sách dấu thời gian được sắp xếp – Geekster

Trả lời

7

Kể từ khi timestamps đều được sắp xếp, bạn có thể sử dụng bisect cho rằng:

In [24]: timestamp_list = [1377091800, 1377093000, 1377094500, 1377095500] 

In [25]: timestamp_list[bisect.bisect_right(timestamp_list, 1377093100)] 
Out[25]: 1377094500 

(tôi đã chuyển đổi các xâu kí tự sang số nguyên để giữ mã rõ ràng.)

+1

Hơn nữa, để sử dụng 'bisect' bạn * có * để sử dụng các số nguyên như phân loại chữ số không nhất thiết phải giống như sắp xếp số, ném' bisect' cho một số edgecases nhất định. Cấp cho, cho timestamps, bạn không có khả năng để đạt những, nhưng vẫn còn. –

+1

Và vì lợi ích đầy đủ (kể từ khi tôi xóa câu trả lời của tôi): 'bisect' mất thời gian O (log N), so với O (N) để quét toàn bộ. Trong thuật ngữ laymans: một heck nhanh hơn rất nhiều. –

+0

Tôi đã chỉnh sửa câu trả lời ở trên cho phù hợp với mục đích của mình. Vì chỉ số được trả về bởi mô-đun «bisect' là nhiều hơn chỉ số yêu cầu, tôi đã giảm nó xuống để có được kết quả mong muốn. Cập nhật câu hỏi của tôi với giải pháp tôi đã sử dụng. – Geekster

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