【问题标题】:iteration and matching items in lists列表中的迭代和匹配项
【发布时间】:2015-09-29 18:51:12
【问题描述】:

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

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”。有没有办法解决这个问题?

【问题讨论】:

    标签: string list python-3.x iteration


    【解决方案1】:

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

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

    【讨论】:

    • 使用re.compile 比将其放入列表理解中更好!并在每次迭代中编译正则表达式!
    • @Kasra 是的,这就是为什么我使用re.compile 而不是将其放入列表理解中......或者你的意思是什么?
    • @tobias_k..就这样..还有其他方法吗?我还没有通过正则表达式。
    • @LeonSurrao 你的意思是替代正则表达式?当然有,但你应该把它当作通过正则表达式的机会。值得!
    • @tobias_k..我的意思是只使用 for 和 if 语句,拆分或连接。
    猜你喜欢
    • 2019-09-09
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多