Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调查结果;“最近的”;Python列表中的字符串(按字母顺序)_Python_String - Fatal编程技术网

调查结果;“最近的”;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元素(如果存在)是您正在寻找的。为了找到索引,您可以使用。这

我有一个Python字符串列表,例如初始化如下:

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]