如果我想定义一个名为match_numbers的函数,它将一个列表中的区域代码与另一个列表的电话号码相匹配,我应该如何修复我的代码?例如:
match_phone(['666', '332'], ['(443)241-1254', '(666)313-2534', '(332)123-3332'])
会给我
(666)313-2534
(332)123-3332
我的代码是:
def phone (nlist, nlist1):
results = {}
for x in nlist1:
results.setdefault(x[0:3], [])
results[x[0:3]].append(x)
for x in nlist:
if x in results:
print(results[x])
此代码的问题是:
答案 0 :(得分:3)
现在,有更好/更快的方法来做你想做的事情,但让我们专注于修复你的代码。
您遇到的第一个问题是如何切割字符串。请记住,你从索引0开始。所以如果你这样做:
x[0:3]
你实际得到的是你的字符串:
(12
而不是你想要的:
123
因此,知道索引从0开始,你真正想做的就是切割你的字符串:
x[1:4]
最后,你的话在这里:
results[x[0:3]].append(x)
这里有两个问题。
首先,如上所述,您仍在尝试对字符串的错误部分进行切片,以便修复它。
其次,由于您正在尝试创建一个键值对,上面的行实际上正在做的是创建一个键值对,其中值是一个列表。我认为你不想这样做。你想做类似的事情:
{'123': '(123)5556666'}
所以,在这种情况下你不想使用append。您要做的是直接将字符串指定为该键的值。你可以这样做:
results[x[1:4]] = x
最后,另一个被注意到的问题是你在这里做的事情:
results.setdefault(x[1:4], [])
基于上面有关如何将字符串作为值存储在字典而不是列表中的说明,因此您无需执行此操作。因此,您应该只删除该行,它不会用于您尝试执行的任何操作。您已将字典初始化为results = {}
当你把它们放在一起时,你的代码将如下所示:
def match_phone(nlist, nlist1):
results = {}
for x in nlist1:
results[x[1:4]] = x
for x in nlist:
if x in results:
print(results[x])
match_phone(['666', '332'], ['(443)241-1254', '(666)313-2534', '(332)123-3332'])
并将提供以下输出:
(666)313-2534
(332)123-3332
答案 1 :(得分:0)
你可以这样做:
phone_numbers = ['(443)241-1254', '(666)313-2534', '(332)123-3332']
area_codes = ['666', '332']
numbers = filter(lambda number: number[1:4] in area_codes, phone_numbers)
for number in numbers:
print(number)
在不使用filter
的情况下执行此操作的另一种类似方法可能是这样的:
for number in phone_numbers:
if number[1:4] in area_codes:
print(number)
两种情况下的输出都是:
(666)313-2534
(332)123-3332
答案 2 :(得分:0)
如果所有电话号码都采用(ddd)ddd-dddd
格式,您可以使用
for number in (num for num in nlist1 if num[1:4] in nlist):
print(number)
在我看来,你可以使用比nlist和nlist1更好的变量名。
答案 3 :(得分:0)
def match_phone(area_codes, numbers):
area_codes = set(area_codes)
for num in numbers:
if num in area_codes:
print num
答案 4 :(得分:-1)
没有人使用正则表达式解决方案!这也可能是一种选择。
import re
def my_formatter(l1,l2):
mydic = {re.match(r'([(])([0-9]+)([)])([0-9]+[-][0-9]+)',i).group(2):re.match(r'([(])([0-9]+)([)])([0-9]+[-][0-9]+)',i).group(4) for i in l2}
for i in l1:
print "({0}){1}".format(str(i),str(mydic.get(i)))
my_formatter(['666', '332'], ['(443)241-1254', '(666)313-2534', '(332)123-3332'])
打印 -
(666)313-2534
(332)123-3332