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


但是,此代码的问题是:


它在括号中给了我输出,而我想打印
像上面显示的那样逐行输出,并且
它不适用于第二个列表中的寄生虫(例如
(666)543-2322必须转换为666-543-2322,列表才能
工作。

最佳答案

现在,有更好/更快的方法可以完成您想做的事情,但是让我们专注于修复您的代码。

您遇到的第一个问题是如何对字符串进行切片。请记住,您从索引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

09-26 02:35