函数定义:将区号与 Phone 号码匹配
Function Definition: Matching Area Codes to Phone Numbers
如果我想定义一个名为 match_numbers 的函数,它将一个列表中的区号与另一个列表中的 phone 号码相匹配,我应该如何修正我的代码?例如:
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])
然而,这段代码的问题是:
- 它给了我括号中的输出,而我想要它打印
如上所示逐行输出,并且
- 它不适用于第二个列表中的括号(例如
(666)543-2322 必须转换为 666-543-2322 才能将列表转换为
工作。
你可以这样做:
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
如果所有 phone 数字都采用 (ddd)ddd-dddd
格式,您可以使用
for number in (num for num in nlist1 if num[1:4] in nlist):
print(number)
在我看来,您可以使用一些比 nlist 和 nlist1 更好的变量名。
现在,有 better/faster 方法可以完成您想要做的事情,但让我们专注于修复您的代码。
您遇到的第一个问题是如何对字符串进行切片。请记住,您从索引 0 开始。因此,如果您这样做:
x[0:3]
你实际上从你的字符串中得到的是这样的:
(12
而不是你想要的:
123
所以,知道索引从 0 开始,您真正想要做的是将您的字符串切成这样:
x[1:4]
最后,你的台词在这里:
results[x[0:3]].append(x)
这里有两个问题。
首先,如上所述,您仍在尝试对字符串的错误部分进行切片,因此请修复它。
其次,由于您正在尝试创建一个键值对,所以上面那行实际上是在创建一个键值对,其中的值是一个列表。我认为你不想那样做。你想做这样的事情:
{'123': '(123)5556666'}
因此,您不想在这种情况下使用追加。您要做的是直接将字符串分配为该键的值。您可以这样做:
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
def match_phone(area_codes, numbers):
area_codes = set(area_codes)
for num in numbers:
if num in area_codes:
print num
没有人有正则表达式解决方案!这也可能是一个选择。
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
如果我想定义一个名为 match_numbers 的函数,它将一个列表中的区号与另一个列表中的 phone 号码相匹配,我应该如何修正我的代码?例如:
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])
然而,这段代码的问题是:
- 它给了我括号中的输出,而我想要它打印 如上所示逐行输出,并且
- 它不适用于第二个列表中的括号(例如 (666)543-2322 必须转换为 666-543-2322 才能将列表转换为 工作。
你可以这样做:
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
如果所有 phone 数字都采用 (ddd)ddd-dddd
格式,您可以使用
for number in (num for num in nlist1 if num[1:4] in nlist):
print(number)
在我看来,您可以使用一些比 nlist 和 nlist1 更好的变量名。
现在,有 better/faster 方法可以完成您想要做的事情,但让我们专注于修复您的代码。
您遇到的第一个问题是如何对字符串进行切片。请记住,您从索引 0 开始。因此,如果您这样做:
x[0:3]
你实际上从你的字符串中得到的是这样的:
(12
而不是你想要的:
123
所以,知道索引从 0 开始,您真正想要做的是将您的字符串切成这样:
x[1:4]
最后,你的台词在这里:
results[x[0:3]].append(x)
这里有两个问题。
首先,如上所述,您仍在尝试对字符串的错误部分进行切片,因此请修复它。
其次,由于您正在尝试创建一个键值对,所以上面那行实际上是在创建一个键值对,其中的值是一个列表。我认为你不想那样做。你想做这样的事情:
{'123': '(123)5556666'}
因此,您不想在这种情况下使用追加。您要做的是直接将字符串分配为该键的值。您可以这样做:
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
def match_phone(area_codes, numbers):
area_codes = set(area_codes)
for num in numbers:
if num in area_codes:
print num
没有人有正则表达式解决方案!这也可能是一个选择。
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