我希望有一个查找表返回多个值。
例如,如果用户名是“ joe”,我想返回一个对象,例如:
{'name': 'Joseph', 'gender': 'm', 'xro': 'xy'}
此刻,我有一个函数可以接受输入,将其匹配到预定义的形式之一,然后返回确定的形式:
def names_lookup(txt):
name_forms = {
'Joseph': ['joe', 'joseph', 'guiseppe', 'joey'],
'Samuel': ['sam', 'samuel', 'shmuel', 'kamuel']
}
for canon in name_forms:
for variant in name_forms[canon]:
if txt.lower() == variant.lower():
return canon
cannonical_name = names_lookup('joey'); #returns "Joseph"
目前,我有多个查找表以返回构造对象所需的其他值-但是有没有办法使单个查找表返回一个对象?
因此,所需的输出将是:
cannonical_name = new_names_lookup('joey')
#returns: {'name': 'Joseph', 'gender': 'm', 'xro': 'xy'}
答案 0 :(得分:3)
您有两个简单的选择。一个是标准的查找列表,如Evan的评论所示:
{'guiseppe': 'Joseph', 'joe': 'Joseph', 'joey': 'Joseph', 'joseph': 'Joseph',
'Samuel': 'Samuel', 'sam': 'Samuel', 'samuel': 'Samuel', 'shmuel': 'Samuel'}
现在,对其进行修改以返回完整的 object 而不是名称。由于您未指定对象,因此我假设一个Person
类:
joseph = Person(name = "Joseph", gender = "m", xro = "xy")
samuel = Person(name = "Samuel", gender = "m", xro = "xy")
现在,只需将对象插入查询表中即可
{'guiseppe': joseph, 'joe': joseph, 'joey': joseph, 'joseph': 'Joseph',
'Samuel': samuel, 'sam': samuel, 'samuel': samuel, 'shmuel': 'Samuel'}
另一种查找方法是从现有代码中删除多余的循环。使用in
运算符:
for canon in name_forms:
for variant in name_forms[canon]:
if txt.lower() in variant:
return canon
您仍然需要一个字符串到对象的表,但是现在它更短了:
{"Joseph": jospeh, "Samuel": samuel}
答案 1 :(得分:2)
取决于问题。 你到底想要什么?
我只能提出这样的东西:
def lookup(txt):
name_forms = {
'Joseph': ['joe', 'joseph', 'guiseppe', 'joey'],
'Samuel': ['sam', 'samuel', 'shmuel', 'kamuel'],
'Maria': ['mary', 'marie', 'miriam', 'mariana']}
for i, canon in enumerate(name_forms):
for variant in name_forms[canon]:
if txt.lower() == variant.lower():
if i <= 1:
gender = 'm'
xro = 'xy'
else:
gender = 'f'
xro = 'xx'
return {'name': canon, 'gender': gender, 'xro': xro}
lookup('joey')
我没有更改您的查找方法,但是绝对不能像其他人提到的那样有效。
答案 2 :(得分:1)
我不知道您要存储多少个值,但是遍历所有内容看起来很麻烦。
您是否尝试过以其他方式存储数据? (如其他建议所示,没有看到其他答案)
也许:
name_forms = {
'joe':'Joseph',
'joseph':'Joseph',
'guiseppe':'Joseph',
'joey':'Joseph',
'sam':'Samuel',
'samuel':'Samuel',
'shmuel':'Samuel',
'kamuel':'Samuel'
}
other_format={
'Joseph': ['joe', 'joseph', 'guiseppe', 'joey'],
'Samuel': ['sam', 'samuel', 'shmuel', 'kamuel']
}
def names_lookup(txt):
if txt in name_forms:
return name_forms[txt]
else:
return None
如果您不希望以这种方式存储它,则可以通过
创建它 data_base = {x:k for k,v in other_format.items() for x in v}
此外,如果您不想继续手动键入这些单词的变体,可以看看余弦相似度。