Python使用不区分大小写搜索集合

时间:2013-06-19 11:38:08

标签: python search set case-insensitive

我有3套和一个字典。我的套装看起来像这样:

set1 = set(['Bob', 'Jim', 'RALPH'])
set2 = set(['Jill', 'Nadeen', 'WaterBottle'])
set3 = set(['ThisIsOne', 'ThisIsTwo'])
all_names = {'first_one': set1, 
             'second_one': set2, 
             'third_one': set3, 
             'all':set1 | set2 | set3}

#I can make it work if I do this:
r = re.search(input, "','".join(all_names['all'])
if r:
    name = all_names[r.group()]

我的用户将传入前三组中的一个名称,或者all_names中的一个键。用户传入的名称不区分大小写,但我需要返回相应的名称,因为它们在集合中大写。如果他们传入一个密钥,我没有问题获取名单,但有一个好方法,如果用户传入说'nadeen',我可以在all_names ['all']中轻松(和有效)找到它?

但是,我的老板并不认为这是最好的方法。有没有办法对此进行理解?还有其他想法吗?

2 个答案:

答案 0 :(得分:4)

嗯,相当天真的方法是迭代all_names['all']并进行不区分大小写的检查,如下所示:

input = input.lower()
result = [item for item in all_names['all'] if item.lower() == input]

或者,另一种方法是在列表中搜索包含下限项目的列表:

input.lower() in map(lambda x: x.lower(), all_names['all'])

答案 1 :(得分:0)

我会创建一个字典,将小写单词映射到具有适当大小写的单词:

>>> set1 = set(['Bob', 'Jim', 'RALPH'])
>>> set2 = set(['Jill', 'Nadeen', 'WaterBottle'])
>>> set3 = set(['ThisIsOne', 'ThisIsTwo'])
>>> d = {x.lower():x for x in set1|set2|set3}
>>> d
{'thisistwo': 'ThisIsTwo', 'thisisone': 'ThisIsOne', 'waterbottle': 'WaterBottle', 'jim': 'Jim', 'ralph': 'RALPH', 'jill': 'Jill', 'nadeen': 'Nadeen', 'bob': 'Bob'}

现在您只需要验证小写输入。从你的帖子来看,很难说你是应该为每一组使用字典,还是仅使用主词典,但我认为最终的想法是一样的。