我需要清理一个包含名称的字符串列表。我需要删除标题,然后像等的东西。代码运行正常,但我想将它转换为两个理解列表。我的尝试,像这个[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)
发布于 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']
发布于 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
列表是动态生成的,或者太长,我们将无法为其形成正则表达式。这个解决方案在任何情况下都很有效。
https://stackoverflow.com/questions/49496014
复制相似问题