2015-07-10 58 views
1

我正在尝试检查列表中的元素是否与其他元素匹配。但是这个问题稍有转折。迭代和匹配列表中的项目

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”在过去的电话号码。有没有办法来解决这个问题?

回答

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] 

不过,我想强烈建议只是将此作为入门用正则表达式的机会。这并不困难,绝对值得!

+0

使用're.compile'比将它放在列表理解中更好!在每次迭代中编译正则表达式! – Kasramvd

+1

@Kasra是的,这就是为什么我使用're.compile'而不是将它放在列表理解中......或者你是什么意思? –

+0

@ tobias_k..just so..is there a alternative way?我还没有经过正则表达式。 –