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