比较列表 L 中的子字符串 l 和字符串 S 并根据 L 中的 l 编辑 S 的最 pythonic 方法?



列表['a','a #2','a(Old)']应该变得{'a'},因为'#''(Old)'将被切除,并且不需要重复列表。我努力用生成器开发一个列表理解,并决定这样做,因为我知道它会起作用,并且比看起来更好更看重时间:

l = []
groups = ['a','a #2','a(Old)']
for i in groups:
if ('#') in i: l.append(i[:i.index('#')].strip())
elif ('(Old)') in i: l.append(i[:i.index('(Old)')].strip())
else: l.append(i)
groups = set(l)

获得此结果的巧妙方法是什么?

如果要从wastes中的部分中清除列表lst的元素,这是通用解决方案:

lst = ['a','a #2','a(Old)']
wastes = ['#', '(Old)']
cleaned_set = {
min([element.split(waste)[0].strip() for waste in wastes]) 
for element in arr
}

您可以在单个集合理解中编写整个表达式

>>> groups = ['a','a #2','a(Old)']
>>> {i.split('#')[0].split('(Old)')[0].strip() for i in groups}
{'a'}

这将获取#之前的所有内容和'(Old)'之前的所有内容,然后修剪空格。其余部分被放入一个集合中,该集合仅保留唯一值。

您可以定义一个帮助程序函数来应用所有拆分,然后使用集合推导式。

例如:

lst = ['a','a #2','a(Old)', 'b', 'b #', 'b(New)']
splits = {'#', '(Old)', '(New)'}
def split_all(a):
for s in splits:
a = a.split(s)[0]
return a.strip()
groups = {split_all(a) for a in lst}
#{'a', 'b'}

最新更新