迭代和匹配列表中的项目

iteration and matching items in lists

我正在尝试检查列表中的元素是否与另一个列表中的元素相匹配。但是这个问题有点曲折。

alist = ['949', '714']
blist = ['(714)824-1234', '(419)312-8732', '(949)555-1234', '(661)949-2867']

我正在尝试将 alist 的元素与 blist 匹配,但只是区号部分(在 blist 中)。这是我当前的代码:

def match_area_codes(alist, blist):
clist =[]
for i in alist:
    for j in blist:
        if i in j:
            clist.append(j)
return clist

该代码在大部分情况下都有效,除非列表中的其他任何位置都有与区号匹配的字符串。它应该只打印:

['(714)824-1234', '(949)555-1234']

但最终打印出来

['(714)824-1234', '(949)555-1234', '(661)949-2867']

因为最后一个 phone 号码中有一个“949”。有办法解决这个问题吗?

您可以使用 regular expression 获取 (...) 内的部分并将该部分与 alist 进行比较。

import re
def match_area_codes(alist, blist):
    p = re.compile(r"\((\d+)\)")
    return [b for b in blist if p.search(b).group(1) in alist]

示例:

>>> alist = set(['949', '714'])
>>> blist = ['(714)824-1234', '(419)312-8732', '(949)555-1234', '(661)949-2867']
>>> match_area_codes(alist, blist)
['(714)824-1234', '(949)555-1234']

如果你 真的 想不用正则表达式来做,你可以,例如,找到 () 的位置,这样从区域代码对应的字符串中获取切片。

def match_area_codes(alist, blist):
    find_code = lambda s: s[s.index("(") + 1 : s.index(")")]
    return [b for b in blist if find_code(b) in alist]

但是,我强烈建议将此作为开始使用正则表达式的机会。这并不难,绝对值得!