这段代码是我根据上周参加的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的名字匹配。-假设匹配始终从名称或电话号码的开头开始,输出下列输入的自动完成联系人:
我粘贴联系人列表(contacts.txt) 这里。
我的想法:
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尽管上面的函数返回了正确的答案,但是,我想知道我还能进一步改进什么。
发布于 2019-12-17 06:33:09
t9_dict变成了一个常数T9_DICT。
t9_input函数函数如果被命名为number_to_chars_t9 (或number_to_t9chars).,则更好地反映出“忽略1's和0's”的问题的意图--与其在每次迭代中执行过滤条件,0和1可以用灵活的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函数来完成。最后,以下是完整的优化实现:
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"测试:
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)))输出(连续):
Patricia Adkins 741-256-2766
Kadyn Giles 597-981-0606
Brennan Rosales 930-238-6553
no resulthttps://codereview.stackexchange.com/questions/234160
复制相似问题