2017-04-18 167 views
0

假设我有一个来自哈利波特魔法生物的按字母顺序排列的列表,需要找出列表中的新发现属于哪个(基于索引)。经过比我不想承认更多的思考,我想出了以下内容:获取字符串属于按字母顺序排列的字符串列表的索引的最佳方法?

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。

+0

你只是想知道的位置,或只是保持列表的字母顺序? – Jeremy

+1

知道它所属的位置。这个函数实际上并不会改变我遵循的列表 – Maccus

回答

4

无论何时您有一个已订购的清单,并且您想保留该清单,请使用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插入namealpha_list保持不变。

如果你比较必须以小写只有你可以这样做:

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

,但这里的关键是我需要返回名称在alpha_list中的位置的索引,而不是实际上以任何方式更改alpha_list。但是,让我们说名称='匈牙利Horntail'和alpha_list = ['Acromantula','Basilisk','Hippogriff','Merperson','蟾蜍','巨魔','Thestral','Pixie']。所以这个函数将返回整数3 – Maccus

+0

@Maccus添加了一个小例子来澄清。希望有所帮助。 –

+0

它似乎对分实际上是一个模块不是功能?根据我的python 3,至少我认为你可能会错误地使用它,但我会试着弄清楚它!感谢提示芽 – Maccus

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 
+0

这工作得很好,但它似乎平分法更清洁,但谢谢你!如果你不能导入,这是要走的路 – Maccus

+0

@Maccus你对'如果你不能导入'是什么意思? 'bisect'在Python标准库中;即它自带了解释器。如果没有这样的模块,[二进制搜索](https://en.wikipedia.org/wiki/Binary_search_algorithm)仍然是最有效的方法 - 你只需要自己实现它。 –

+0

@hiroprotagonist如果您不知道情况的完整用例,则无法说出最有效的方式。如果@maccus只有一个小的'alpha_list',它可能不会保证写一个自定义的二进制搜索。因为它是标准库的一部分,所以Bisect显然是清洁/可用性/效率的途径。为什么你想要做出虚假的陈述,而这些虚假的陈述根据可能永远不会是真实的情况而无法备份? – Jeremy

相关问题