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

Python 功能定义:将区号与电话号码匹配,python,list,function,input,definition,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 (666)313-2534 (332)123-3332 我的代码是: def phone (nlist, nlist1): r

如果我想定义一个名为match_numbers的函数,将一个列表中的区号与另一个列表中的电话号码进行匹配,我应该如何修复代码?例如:

match_phone(['666', '332'], ['(443)241-1254', '(666)313-2534', '(332)123-3332'])
会给我

(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)
    
    for number in phone_numbers:
        if number[1:4] in area_codes:
            print(number)
    
    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'])
    
    不使用
    过滤器的另一种类似方法可能是:

    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)
    
    for number in phone_numbers:
        if number[1:4] in area_codes:
            print(number)
    
    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
    

    如果所有电话号码的格式均为
    (ddd)ddd ddddd
    ,则可以使用

    for number in (num for num in nlist1 if num[1:4] in nlist): 
       print(number)
    

    在我看来,您可以使用比nlist和nlist1更好的变量名。

    现在,有更好/更快的方法来完成您试图完成的任务,但让我们集中精力修复代码

    第一个问题是如何切片字符串。请记住,从索引0开始。如果这样做:

    x[0:3]
    
    实际上,从字符串中可以得到如下内容:

    (12
    
    而不是你想要的:

    123
    
    因此,知道索引从0开始,您实际上要做的是将字符串切片如下:

    x[1:4]
    
    results[x[1:4]] = x
    
    最后,你的台词是:

    results[x[0:3]].append(x)
    
    这里有两个问题

    首先,如上所述,您仍在尝试分割字符串的错误部分,因此请修复该问题

    第二,由于您正在尝试创建一个键值对,因此上面这一行实际上正在创建一个键值对,其中的值是一个列表。我认为您不想这样做。您希望执行以下操作:

    {'123': '(123)5556666'}
    
    因此,在这种情况下,您不想使用append。您要做的是直接将字符串指定为该键的值。您可以这样做:

    x[1:4]
    
    results[x[1:4]] = x
    
    最后,我们注意到的另一个问题是您在这里所做的工作:

    results.setdefault(x[1:4], [])
    
    基于上面关于如何将字符串作为值存储在词典中而不是列表中的解释,因此不需要执行此操作。因此,您只需删除该行,它对您尝试执行的操作没有任何作用。您已经将词典初始化为
    results={}

    当您将所有代码放在一起时,您的代码将如下所示:

    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)
    
    for number in phone_numbers:
        if number[1:4] in area_codes:
            print(number)
    
    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'])
    
    并将提供以下输出:


    没有人使用正则表达式解决方案!这可能也是一个选项

    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
    

    电话号码的格式是否总是
    (xxx)xxx xxxx
    ?@Deer530我又做了一个小的更新,以防您还没有看到它。查看设置了默认值的行。您应该将默认值设置为
    ,而不是
    []
    结果。设置默认值(x[1:4],“”)
    考虑到您当时的
    结果[x[1:4]毫无意义=x
    @padraiccnningham哇,是的。感谢您的关注。我更新了。让我知道您的想法。@padraiccnningham是的,那会很好。我的目标是帮助OP解决他们的显式问题,让他们的代码正常工作。他们的数据结构始终是这种格式。您介意我将此作为增强型解决方案附加到我的解决方案中吗?很乐意与大家分享。或者,你也可以发布。这是一个很好的解决方案。感谢@PadRaiccunningham的输入。你需要解释一下这段代码的作用。有人已经将其标记为低质量的答案,现在它在低质量的帖子评论队列中,因此有被删除的风险。