Python 返回该单词后列表中的下一个字母项目,可以提高性能

Python 返回该单词后列表中的下一个字母项目,可以提高性能,python,performance,list,sorting,dictionary,Python,Performance,List,Sorting,Dictionary,嗨,我想有一个有效的代码,用于返回该单词后的下一个字母项目。例如,在下面的列表中,输入dog时返回lion。我需要一次又一次地指定输入,因此可以从预排序列表中获益,并每次保存O(nlogn)时间 代码正在按预期运行,我只是希望它在很长的列表中运行得更快 a = ['donkey','alligator','zebra','monkey','dog','cat','lion','bull','ant'] ## Output of dog should be: lion input_word =

嗨,我想有一个有效的代码,用于返回该单词后的下一个字母项目。例如,在下面的列表中,输入dog时返回lion。我需要一次又一次地指定输入,因此可以从预排序列表中获益,并每次保存O(nlogn)时间

代码正在按预期运行,我只是希望它在很长的列表中运行得更快

a = ['donkey','alligator','zebra','monkey','dog','cat','lion','bull','ant']

## Output of dog should be: lion

input_word ='dog'

def get_next(input_word):
    b = sorted(a[a.index(input_word):])
    d = {j:i for i,j in enumerate(b)} 
    try: 
        return(b[d[input_word]+1])
    except:
        if len(d)==1:
            return("Last value")
        else:
            return("No value greater than input")

print(get_next(input_word))

编辑:下一个元素应该按字母顺序排列在dog的旁边,因此列表中第一个以字母“d”和“dog”开头的元素是lion

Edit2:如果列表是a=['x','z','y',更多示例
如果输入为x,则结果应为y;如果输入为y,则输出应为“最后一个字”;如果输入为z,则输出应为“不大于输入的值”

而不是排序,在每次必须处理未排序的数组时,可以尝试不同的逻辑:

def get_next_optimized(input_word):
    # Collect only animals who are alphabetically greater than input word
    b = [animal for animal in a if animal[0] > input_word[0]]

    return min(b) if len(b) > 0 else ("No value greater than input")
或者,如果您有权访问预排序列表,请尝试生成器表达式-

def get_next_optimized_pre_sorted(input_word):
    next_alphabet_word_generator = (animal for animal in sorted_a if animal[0] > input_word[0])

    return next(next_alphabet_word_generator)

记住对输入进行健全性检查和验证。特别适用于输入单词为空或a中可能有空元素的情况。更改代码以满足您的需求。

最有效的解决方案是预先计算一个dict,将每个单词映射到下一个单词。不必每次都搜索列表,只需在目录中查找即可立即获得正确的结果:

a = ['donkey','alligator','zebra','monkey','dog','cat','lion','bull','ant']

next_word_dict = {}
for i, word in enumerate(a):
    # from the remaining words, filter out those are
    # alphabetically smaller than the current word
    itr = (w for w in a[i+1:] if w > word)

    # from those words, find the one that's first
    # in the alphabet
    try:
        next_word = min(itr)
    except ValueError:
        # if we couldn't find a greater word, set
        # an appropriate error message
        if i == len(a)-1:
            next_word = 'Last value'
        else:
            next_word = 'No value greater than input'

    next_word_dict[word] = next_word
get_next
函数现在被简单地定义为

def get_next(input_word):
    return next_word_dict[input_word]
并验证其是否正常工作:

>>> get_next('dog')
'lion'

“dog”的输入为什么要将“lion”作为输出?下一个元素不是“猫”吗?下一个元素应该是按字母顺序排列在狗的旁边,因此列表中字母“d”和“狗”之后的第一个元素是狮子,但按字母顺序排列在“狗”之后的下一个单词是“驴”…好的,那么如果列表是
a=['x','z','y']
并且输入是
input\u word='x'
,那么结果应该是“z”或者“y”?如果输入是x,结果应该是y,如果输入是y,输出应该是“最后一个字”,如果输入是z,那么输出不应该大于输入值,这正是我要找的!!谢谢谢谢,这是一个好东西,但即使有预先排序的列表,也可能需要O(n)时间。Aran Fey提供的解决方案在预计算字典生成一次后需要O(1)时间。因此,我可以对此进行大量查询。