在按字母顺序排列的字符串列表中获取字符串所在位置的索引的最佳方法是什么?

时间:2017-04-18 10:53:55

标签: python list

假设我有一个按字母顺序排列的哈利波特魔法生物列表,需要找出列表中新发现所属的位置(基于索引)。经过多次思考而不是我想承认之后,我想出了以下内容:

def find_insert_position(name, alpha_list):

    pos = 0
    end = len(alpha_list)
    for n in range(len(name)):
        for i in range(pos, end):
            if (pos != end):
                if ((name[n].lower() > alpha_list[i - 1][n].lower()) and (name[n].lower() <= alpha_list[i][n].lower())):
                    pos == i


                if ((name[n].lower() < alpha_list[i + 1][n].lower()) and (name[n].lower() >= alpha_list[i][n].lower())):
                    end == i
            elif (pos == end):
                return pos

我确信有更好的方法可以解决这个问题,而且我也很确定上述方法甚至无法正常工作。有什么建议吗?

让我们说 name ='Hungarian Horntail'和 alpha_list = ['Acromantula','Basilisk','Hippogriff','Merperson','Toad','Troll','Thestral','Pixie']。 所以这个函数会返回整数3,表示索引名称属于alpha_list。

2 个答案:

答案 0 :(得分:4)

如果您有一个已订购的列表并且想要将其保留在oder中,请使用bisect module。它效率极高,能满足您的需求。

为您的例子:

from bisect import bisect

name = 'Hungarian Horntail'
alpha_list = ['Acromantula', 'Basilisk', 'Hippogriff', 'Merperson', 'Toad',
              'Troll', 'Thestral', 'Pixie']

idx = bisect(alpha_list, name)
print(idx)  # -> 3

这意味着您必须在索引name处插入3alpha_list保持不变。

如果您的比较必须基于小写,则只能执行此操作:

alpha_list_lower = [alpha.lower() for alpha in alpha_list]
idx = bisect(alpha_list_lower, name.lower())

答案 1 :(得分:0)

这就是我要做的事情:

def find_insert_position(name, alpha_list):
    names = [i.lower() for i in alpha_list]
    names.append(name.lower())
    names = sorted(names)
    return names.index(name.lower())

name = 'Hungarian Horntail'
alpha_list = ['Acromantula', 'Basilisk', 'Hippogriff', 'Merperson', 'Toad', 'Troll', 'Thestral', 'Pixie']

find_insert_position(name, alpha_list)

>>> 3