首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python将循环嵌套到一行中

Python将循环嵌套到一行中
EN

Stack Overflow用户
提问于 2018-03-27 00:13:45
回答 2查看 911关注 0票数 0

我需要清理一个包含名称的字符串列表。我需要删除标题,然后像等的东西。代码运行正常,但我想将它转换为两个理解列表。我的尝试,像这个[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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-27 00:26:00

你可以使用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']
票数 1
EN

Stack Overflow用户

发布于 2018-03-27 01:21:30

这个问题是由于for循环中的name = name.replace(e, '')语句造成的,因为我们不能在理解中使用赋值运算符,所以您使用了name.replace(e, ''),但由于python中的string是不可变的,所以replace()方法也不是适当的。

我写的解决方案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的解决方案可以工作,但如果replace列表是动态生成的,或者太长,我们将无法为其形成正则表达式。这个解决方案在任何情况下都很有效。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49496014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档