這裏不要使用列表理解;這是可以做到,但變得醜陋快:
def readcountries():
with open("countries.txt") as fh:
rows = []
for line in fh:
name, area, population = line.split(',')
rows.append([name.strip(), float(area), int(population)])
列表內涵的版本是:
def readcountries():
with open("countries.txt") as fh:
rows = [[n.strip(), float(a), int(p)]
for line in fh for n, a, p in (line.split(','),)]
使用csv
module會爲您節省一些處理:
import csv
def readcountries():
with open("countries.txt") as fh:
reader = csv.reader(fh, skipinitialspace=True)
rows = [[n, float(a), int(p)] for n, a, p in reader]
這裏的模塊處理分割和剝離,爲每一行生成列表對象。
對於二進制搜索,利用Python可以用<
和>
就好了比較字符串;字符串按字典順序進行比較。 ab
比ac
小,但ba
比ab
更大。換句話說,在另一個之前被排序的字符串被認爲是「較小的」。
作爲字符串的排序列表這樣,二進制搜索是從數字的排序列表上的二進制搜索沒有什麼不同。一定要確保你只看元組的第一個元素:
def bisect_right(rows, country, lo=0, hi=None):
if hi is None:
hi = len(rows)
while lo < hi:
mid = (lo + hi) // 2
if country < rows[mid][0]:
hi = mid
else:
lo = mid + 1
return lo
def bisect_left(rows, country, lo=0, hi=None):
if hi is None:
hi = len(rows)
while lo < hi:
mid = (lo + hi) // 2
if rows[mid][0] < country:
lo = mid + 1
else:
hi = mid
return lo
昨天你不是問這個問題爲user3207521嗎? https://stackoverflow.com/questions/21714485/binary-search-for-name/21714939 – hughdbrown
nope不是我...但也許有人在我的班哈哈 – sbhb91