Python嵌套循环到一行

时间:2018-03-26 16:13:45

标签: python python-3.x loops list-comprehension

我需要清理包含名称的字符串列表。我需要删除标题,然后删除类似的东西。代码工作正常,但我想将其转换为两个理解列表。我这样的尝试[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 个答案:

答案 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列表是动态生成的,或者太长,我们就无法为它形成正则表达式。此解决方案在任何情况下都可以使用。