迭代和匹配列表中的项目

时间:2015-07-10 21:35:53

标签: string list python-3.x iteration

我试图检查列表中的元素是否与另一个元素匹配。但这个问题略有不同。

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']

因为最后一个电话号码中有一个'949'。有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

您可以使用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]

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