获取字符串属于按字母顺序排列的字符串列表的索引的最佳方法?
假设我有一个来自哈利波特魔法生物的按字母顺序排列的列表,需要找出列表中的新发现属于哪个(基于索引)。经过比我不想承认更多的思考,我想出了以下内容:获取字符串属于按字母顺序排列的字符串列表的索引的最佳方法?
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
我敢肯定有更好的方法去了解这一点,我也相当肯定上面甚至没有正常工作。有什么建议?
假设 名= '匈牙利树蜂' 和 alpha_list = [ 'Acromantula', '蛇怪', '骏鹰', 'Merperson', '蟾蜍', '巨魔', '夜骐', '精灵'] 。 所以这个函数会返回整数3,表示索引名称属于alpha_list。
无论何时您有一个已订购的清单,并且您想保留该清单,请使用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
这只是意味着你将不得不在指数3
插入name
。 alpha_list
保持不变。
如果你比较必须以小写只有你可以这样做:
alpha_list_lower = [alpha.lower() for alpha in alpha_list]
idx = bisect(alpha_list_lower, name.lower())
,但这里的关键是我需要返回名称在alpha_list中的位置的索引,而不是实际上以任何方式更改alpha_list。但是,让我们说名称='匈牙利Horntail'和alpha_list = ['Acromantula','Basilisk','Hippogriff','Merperson','蟾蜍','巨魔','Thestral','Pixie']。所以这个函数将返回整数3 – Maccus
@Maccus添加了一个小例子来澄清。希望有所帮助。 –
它似乎对分实际上是一个模块不是功能?根据我的python 3,至少我认为你可能会错误地使用它,但我会试着弄清楚它!感谢提示芽 – Maccus
这里就是我想要做的:
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
这工作得很好,但它似乎平分法更清洁,但谢谢你!如果你不能导入,这是要走的路 – Maccus
@Maccus你对'如果你不能导入'是什么意思? 'bisect'在Python标准库中;即它自带了解释器。如果没有这样的模块,[二进制搜索](https://en.wikipedia.org/wiki/Binary_search_algorithm)仍然是最有效的方法 - 你只需要自己实现它。 –
@hiroprotagonist如果您不知道情况的完整用例,则无法说出最有效的方式。如果@maccus只有一个小的'alpha_list',它可能不会保证写一个自定义的二进制搜索。因为它是标准库的一部分,所以Bisect显然是清洁/可用性/效率的途径。为什么你想要做出虚假的陈述,而这些虚假的陈述根据可能永远不会是真实的情况而无法备份? – Jeremy
你只是想知道的位置,或只是保持列表的字母顺序? – Jeremy
知道它所属的位置。这个函数实际上并不会改变我遵循的列表 – Maccus