迭代和匹配列表中的项目
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]
但是,我强烈建议将此作为开始使用正则表达式的机会。这并不难,绝对值得!
我正在尝试检查列表中的元素是否与另一个列表中的元素相匹配。但是这个问题有点曲折。
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]
但是,我强烈建议将此作为开始使用正则表达式的机会。这并不难,绝对值得!