返回多个值的Python查找表

时间:2019-04-03 20:38:47

标签: python python-3.x

我希望有一个查找表返回多个值。

例如,如果用户名是“ 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'}

3 个答案:

答案 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}

此外,如果您不想继续手动键入这些单词的变体,可以看看余弦相似度。