String 列表中的迭代和匹配项
我试图检查一个列表的元素是否与另一个列表的元素匹配。但问题有一个小小的转折String 列表中的迭代和匹配项,string,list,python-3.x,iteration,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:
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'。有办法解决这个问题吗?您可以使用获取(…)
中的零件,并将该零件与列表进行比较
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]
然而,我强烈建议将此作为开始使用正则表达式的一个机会。这并不难,而且绝对值得 使用re.compile
比将其放入列表理解中更好!并在每次迭代中编译正则表达式@Kasra是的,这就是为什么我使用re.compile
而不是把它放在列表中。。。或者你是什么意思?@tobias_k.。就这样。。还有别的办法吗?我还没看过正则表达式。@LeonSurrao你是说正则表达式的替代品?当然有,但是你应该抓住这个机会来学习正则表达式。这是值得的@tobias_k..我的意思是只使用for和if语句、split或join。