我需要清理包含名称的字符串列表。我需要删除标题,然后删除类似的东西。代码工作正常,但我想将其转换为两个理解列表。我这样的尝试[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)
答案 0 :(得分:1)
您可以使用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 :(得分:1)
问题是由for循环中的name = name.replace(e, '')
语句引起的,并且由于我们无法在理解中使用赋值运算符,因此您使用name.replace(e, '')
但是replace()
方法不是因为python中的string
不可变,所以就位。
我编写的解决方案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
列表是动态生成的,或者太长,我们就无法为它形成正则表达式。此解决方案在任何情况下都可以使用。