首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >T9搜索函数

T9搜索函数
EN

Code Review用户
提问于 2019-12-17 03:31:59
回答 1查看 239关注 0票数 2

这段代码是我根据上周参加的codewars事件编写的,在这个事件中我无法理解。

问题是:

T9自动完成文件contacts.txt有名称和电话号码。格式是:第1列=名称,第2列=电话号码,您的程序应该接收一个号码序列,并返回它可能在电话键盘上匹配的联系人。T9自动完成的字母是:[2,“ABC”,3,“DEF”,4,“GHI”,5,“JKL”,6、“MNO”,7,“PQRS”,8,“TUV”,9,“WXYZ”],为了简单起见:-忽略1's和0's的名字匹配。-假设匹配始终从名称或电话号码的开头开始,输出下列输入的自动完成联系人:

  • 七二八
  • 五二三
  • 273
  • 二七三八

我粘贴联系人列表(contacts.txt) 这里

我的想法:

  1. 在数字和字符之间创建字典键值对。
  2. 将数字转换为字符列表,例如728 -> “PQRS”、“ABC”、“TUV”
  3. 循环遍历contacts.txt文件,并检查第一个字符在上面#2中的列表的第一个元素中是否有效。如果是,则在1.之前添加正确的点,然后检查该行中的第二个字符是否存在于上面的列表#2中。如果是,然后再加一个正确的分数1。如果没有,重新设置分数,然后转到下一行。
  4. 如果循环结束时的正确点意味着我们根据搜索条件找到结果。把那条线还给我。
代码语言:javascript
复制
t9_dict = {
    2: "ABC", 
    3: "DEF",
    4: "GHI",
    5: "JKL",
    6: "MNO",
    7: "PQRS",
    8: "TUV",
    9: "WXYZ",
    }

def t9_input(number):

    list_text = []

    for i in str(number):
        if int(i) != 0:
            list_text.append(t9_dict[int(i)])

    return list_text


def read_contact(list_text):

    filename = 'contacts.txt'
    count = 0

    f = open(filename, "r")
    for line in f:

        for j in range(len(list_text)):         
            if count < len(list_text):
                if line.upper()[count] in list_text[count]:
                    count += 1
                else:
                    count = 0
                    break

            else:
                count = 0
                break

            if count == len(list_text):
                f.close()

                return(line)

    f.close()
    return "no result"


#print(t9_input(728))
#print(t9_input(5203))

print(read_contact(t9_input(728))) #return Patricia Adkins        741-256-2766
print(read_contact(t9_input(5203))) #return Kadyn Giles            597-981-0606
print(read_contact(t9_input(273))) #return Brennan Rosales        930-238-6553
print(read_contact(t9_input(2738))) #return no result

尽管上面的函数返回了正确的答案,但是,我想知道我还能进一步改进什么。

EN

回答 1

Code Review用户

回答已采纳

发布于 2019-12-17 06:33:09

走向优化重组

t9_dict变成了一个常数T9_DICT

  • t9_input函数函数如果被命名为number_to_chars_t9 (或number_to_t9chars).,则更好地反映出“忽略1's和0's”的问题的意图--与其在每次迭代中执行过滤条件,01可以用灵活的str.translate函数立即删除:str(number).translate({48: None, 49: None}). Next,更倾向于列表理解而不是构造和附加于list.,更好的是返回一个不可变的T9字符的tuple,以避免损害它们。
  • read_contact函数 list_text参数更好地重命名为有意义的t9_charsets. filename,更好地定义为具有默认值的关键字参数:def read_contact(t9_charsets, filename='contacts.txt'):. 而不是详细的open(...)f.close()调用--使用灵活的上下文管理器with来自动处理文件资源。嵌套的for循环(带所有这些噪声条件,在count变量和break语句周围拖动)都是多余的。所有关键的工作都可以通过内置的zip (生成相应的项对,直到耗尽最短的可迭代性)和all函数来完成。

最后,以下是完整的优化实现:

代码语言:javascript
复制
T9_DICT = {
    2: "ABC",
    3: "DEF",
    4: "GHI",
    5: "JKL",
    6: "MNO",
    7: "PQRS",
    8: "TUV",
    9: "WXYZ",
}


def number_to_chars_t9(number):
    return tuple(T9_DICT[int(num)] 
                 for num in str(number).translate({48: None, 49: None}))


def read_contact(t9_charsets, filename='contacts.txt'):
    with open(filename) as f:
        for line in f:
            if all(c.upper() in t9_chars 
                   for c, t9_chars in zip(line, t9_charsets)):
                return line.strip()
    return "no result"

测试:

代码语言:javascript
复制
print(read_contact(number_to_chars_t9(728)))
print(read_contact(number_to_chars_t9(5203)))
print(read_contact(number_to_chars_t9(273))) 
print(read_contact(number_to_chars_t9(2738)))

输出(连续):

代码语言:javascript
复制
Patricia Adkins        741-256-2766
Kadyn Giles            597-981-0606
Brennan Rosales        930-238-6553
no result
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/234160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档