【问题标题】:python, string comparison not working?python,字符串比较不起作用?
【发布时间】:2012-05-31 01:24:53
【问题描述】:

我的任务是对单词列表创建二进制搜索,我提出了 2 个实现(显然还没有提出尚未找到单词的情况,但这还不是问题) ,但是当列表缩小到我要查找的单词时,我的函数没有完成,而是继续运行,直到超过最大递归深度。

我打印出来,它清楚地显示了dasList[mid] 的单词,并一遍又一遍地显示,直到它最终放弃。

def _bisect2(dasList, word):
    mid = int(len(dasList)/2)
    if word.lower() > dasList[mid].lower():
        return _bisect2(dasList[mid: len(dasList)], word)            
    if word.lower() < dasList[mid].lower():
        return _bisect2(dasList[0: mid], word)
    else:
        return mid

这是被调用的

print(_bisect2(fileList, input('Please type a word')))

我正在使用 Python 3.0 解释器。有什么建议吗?

【问题讨论】:

  • 两种实现都会出现此错误。
  • 只是好奇,你忘了预排序fileList吗?
  • 标准库已经包含一个bisect 模块。这是作业吗?

标签: python string python-3.x compare


【解决方案1】:

您的实现(几乎)对我有用(并且没有显示您使用我的预排序输入描述的行为)。我假设您已经对输入文件进行了排序?下面发布了一个稍作修改(工作)的示例。

def _bisect2(dasList, word,lidx=0):
    mid = int(len(dasList)/2)
    if word.lower() > dasList[mid].lower():
        return _bisect2(dasList[mid:], word,lidx=lidx+mid)            
    elif word.lower() < dasList[mid].lower():
        return _bisect2(dasList[:mid], word,lidx=lidx)
    return lidx+mid

words=sorted(["one","two","three","four","five","twenty","foo"])
print (words)
print (_bisect2(words,'three'))

请注意,您返回的是最后一个部分列表中的索引(始终为 0)...

【讨论】:

  • 是的,单词列表已经排序,是的,你是对的,它会返回一个 0。然而,我注意到的是我输入的单词似乎在末尾附加了一个空格。为什么会这样?
  • 好吧,这样就行了;) 那么你的话不在列表中。只需strip 您的输入,您就可以了。
  • 很酷,谢谢。 ^^ 为什么要附加它?是否只是按下回车后添加的换行符?
  • @Tony -- 我不确定。尝试使用raw_input 而不是input - 因为你想要字符串,所以无论如何这可能更安全。
  • 所有帐户的“raw_input()”已更改为输入stackoverflow.com/questions/954834/…,在调查“.strip()”后,我遇到了“.rstrip()”,它也完成了这项工作。感谢您的帮助!
【解决方案2】:

这对我来说很好。请注意,最后返回的索引将始终是该单词在最小列表中的索引,而不是原始列表的索引。

另请参阅&gt; 比较不会再次对列表进行 len,它只是迭代到最后。如果您要迭代到末尾,切片语法允许您省略最后一个数字。

words = "The quick brown fox jumped over the lazy dog".split()

def bisect(words, word):
    mid = int(len(words)/2)
    if word.lower() > words[mid].lower():
        return bisect(words[mid:], word)
    elif word.lower() < words[mid].lower():
        return bisect(words[0:mid], word)
    return mid

words = sorted(words)
print bisect(words, 'dog')

【讨论】:

    【解决方案3】:

    为什么不使用 Python 的 bisect 模块?

    Recipe 来自文档:

    def index(a, x):
        'Locate the leftmost value exactly equal to x'
        i = bisect_left(a, x)
        if i != len(a) and a[i] == x:
            return i
        raise ValueError
    

    例子:

    >>> a = ['alfred','edward','mary','susan','thomas','wilma']
    >>> index(a, 'mary')
    2
    >>> index(a, 'martha')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 6, in index
    ValueError
    

    【讨论】:

    • 因为搞清楚实现更有趣^^
    • @Tony:很公平。如果速度很关键,请使用 bisect 模块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2014-04-03
    • 2012-01-22
    • 2017-12-07
    • 1970-01-01
    相关资源
    最近更新 更多