簡體   English   中英

如何在python中對字符串元素的排序列表應用二進制搜索?

[英]how to apply binary search in python on sorted list of string elements?

我有一個排序的字符串元素列表(城市名稱),我想對此進行二進制搜索並通過輸入首字母來過濾城市?

例如用戶輸入的內容: http : //127.0.0.1 : 8000/api/?city=New

因此,在這種情況下,我需要找出從新城市開始的城市

樣本輸出:

[
"New Abbey|Ceredigion|United Kingdom",
"New Albany|Indiana|United States",
"New Albany|Kansas|United States",
"New Albany|Mississippi|United States",
"New Albany|Ohio|United States"
]

請指教。

以下方法應該起作用。 它使用Python自己的二進制搜索庫bisect在列表中查找初始索引。 對於搜索詞New ,我的示例列表返回2。 然后,可以使用itertools.takewhile返回條目,直到搜索詞失敗為止:

import bisect, itertools

locations = [
    "Aaaa|aaaa|Test",
    "Bbbb|bbbb|Test",
    "New Abbey|Ceredigion|United Kingdom",
    "New Albany|Indiana|United States",
    "New Albany|Kansas|United States",
    "New Albany|Mississippi|United States",
    "New Albany|Ohio|United States",
    "Zzzz|zzzz|Test"
    ]

search = "New"
start_index = bisect.bisect_left(locations, search)
print list(itertools.takewhile(lambda x: x.startswith(search), itertools.islice(locations, start_index, None)))

提供以下輸出:

['New Abbey|Ceredigion|United Kingdom', 'New Albany|Indiana|United States', 'New Albany|Kansas|United States', 'New Albany|Mississippi|United States', 'New Albany|Ohio|United States']

您可以使用列表推導過濾所需的項目:

[x for x in cities if x.startswith('New')]

如果您想用python實現二進制搜索,那么這可能會對您有所幫助。

def binarySearch(alist, item):
    first = 0
    last = len(alist)-1
    found = False

    while first<=last and not found:
         midpoint = (first + last)//2
         if alist[midpoint] == item:
             found = True
         else:
             if item < alist[midpoint]:
                 last = midpoint-1
             else:
                 first = midpoint+1

    return found

testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42,]
print(binarySearch(testlist, 3))    
print(binarySearch(testlist, 13))

來源: http : //interactivepython.org/runestone/static/pythonds/SortSearch/TheBinarySearch.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM