代码之家  ›  专栏  ›  技术社区  ›  aviss

Python将循环嵌套到一行中

  •  0
  • aviss  · 技术社区  · 8 年前

    我需要清理包含名称的字符串列表。我需要删除标题,然后删除像’s之类的东西。代码工作正常,但我想将其转换为两个理解列表。我像这样的尝试 [name.replace(e, '') for name in names_ for e in replace] 没用,我肯定错过了什么。非常感谢您的帮助!

    names = ['Mrs Marple', 'Maj Gen Smith', "Tony Dobson's"]
    replace = ['Mrs ', 'Maj ', 'Gen ']
    names_new = []
    for name in names:
        for e in replace:
            name = name.replace(e, '')
        names_new.append(name)
    names_final = []
    for name in names_new:
        if name.endswith("'s"):
            name = name[:-2]
            names_final.append(name)
        else:
            names_final.append(name)
    print(names_final)
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   user3483203    8 年前

    您可以使用 re.sub() 要想做你想做的事:

    import re
    
    names = ['Mrs Marple', 'Maj Gen Smith', "Tony Dobson's"]
    replace = ['Mrs ', 'Maj ', 'Gen ']
    names = [re.sub(r'(Mrs\s|Maj\s|Gen\s|\'s$)', '', x) for x in names]
    print(names)
    

    输出:

    ['Marple', 'Smith', 'Tony Dobson']
    
        2
  •  1
  •   moghya    8 年前

    问题是由于 name = name.replace(e, '') 语句,因为我们不能在理解中使用赋值运算符,所以您使用了 name.replace(e, '') 但是再一次 replace() 方法不作为 string 在python中是不可变的。

    我编写的解决方案I基于使用reduce,这里按顺序替换所有出现的元素 replace 。

    from functools import reduce
    names = ['Mrs Marple', 'Maj Gen Smith', "Tony Dobson's"]
    replace = ['Mrs ','Maj ','Gen ']
    result = [reduce(lambda str, e: str.replace(e, ''), replace, name) for name in names]
    

    结果如下

    print(result)
    ['Marple', 'Smith', "Tony Dobson's"]
    

    @chrisz的解决方案有效,但如果 代替 列表是动态生成的或太长,我们将无法为其形成正则表达式。此解决方案在任何情况下都非常有效。