功能定义:将区号与电话号码匹配

时间:2015-10-17 14:36:37

标签: python list function input definition

如果我想定义一个名为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])

此代码的问题是:

  1. 它给了我括号中的输出,而我希望它打印 逐行输出,如上所示,
  2. 它不适用于第二个列表中的parantheses(例如 (666)543-2322必须转换为666-543-2322才能列表到 工作

5 个答案:

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