调查结果;“最近的”;Python列表中的字符串(按字母顺序)
我有一个Python字符串列表,例如初始化如下:调查结果;“最近的”;Python列表中的字符串(按字母顺序),python,string,Python,String,我有一个Python字符串列表,例如初始化如下: l = ['aardvark', 'cat', 'dog', 'fish', 'tiger', 'zebra'] 我想根据此列表测试输入字符串,并按字母顺序和大小写顺序查找“下面最近的字符串”和“上面最近的字符串”(即没有拼音,只是a),您可以将问题重新表述为: 给定字符串l的排序列表和输入字符串s,在l中查找应插入s的索引,以便插入后l保持排序 位于index-1和index+1的l元素(如果存在)是您正在寻找的。为了找到索引,您可以使用。这
l = ['aardvark', 'cat', 'dog', 'fish', 'tiger', 'zebra']
我想根据此列表测试输入字符串,并按字母顺序和大小写顺序查找“下面最近的字符串”和“上面最近的字符串”(即没有拼音,只是
a),您可以将问题重新表述为:
给定字符串l
的排序列表和输入字符串s
,在l
中查找应插入s
的索引,以便插入后l
保持排序
位于index-1
和index+1
的l
元素(如果存在)是您正在寻找的。为了找到索引,您可以使用。这是一个非常简单的实现,只适用于短列表:您可以非常轻松地遍历列表并将您的选择与每个列表进行比较,然后在您的选择第一次“大于”所比较的项目时中断
for i, item in enumerate(l):
if lower(item) > lower(input):
break
print 'below: %s, above, %s' % (l[i-1], item)
这正是二分法模块的用途。它将比只遍历大型列表快得多
import bisect
def closest(haystack, needle):
if len(haystack) == 0: return None, None
index = bisect.bisect_left(haystack, needle)
if index == 0:
return None, haystack[0]
if index == len(haystack):
return haystack[index], None
if haystack[index] == needle:
return haystack[index], haystack[index]
return haystack[index-1], haystack[index]
上面的代码假设您已将输入和列表全部清理为大写或小写。此外,我在iPhone上写了这段代码,因此请检查拼写错误。这些列表是否相对较短,内容是否发生了变化,或者它们是否相当静态
如果您有大量的字符串,并且它们相对固定,那么您可能需要研究如何将数据存储在Trie结构中。一旦构建了数据,就可以快速方便地搜索并以您喜欢的方式找到最近的邻居。您需要注意列表为空的情况:如果索引==0:left如果index==len(haystack):right=None-other:right=haystack[index]return left,right抱歉,我认为可以在注释中放入代码。如果指针大于haystack中的所有项目,则会出现错误。应该是return haystack[索引-1],无
import bisect
def closest(haystack, needle):
if len(haystack) == 0: return None, None
index = bisect.bisect_left(haystack, needle)
if index == 0:
return None, haystack[0]
if index == len(haystack):
return haystack[index], None
if haystack[index] == needle:
return haystack[index], haystack[index]
return haystack[index-1], haystack[index]