大多数pythonic方法来比较列表L中的子串l和字符串S&根据L中的l编辑S?

时间:2018-03-21 20:19:34

标签: python

列表<script> function test(A) { var B = new Array(); for(var i=0; i<A.length; i++) { B[i] = function value() { return A[i]; }; } for(var i=0; i< B.length; i++) { console.log(B[i].value()); } return B; } A=[1,2,3]; B = test(A); </script> 应该变为['a','a #2','a(Old)'],因为要删除{'a'}'#',并且不需要重复列表。我努力用发电机开发一个列表理解并坚持这个,因为我知道它的工作和重视时间而不是看起来很好:

'(Old)'

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

3 个答案:

答案 0 :(得分:1)

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

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

这将获得#之前的所有内容以及'(Old)'之前的所有内容,然后修剪空格。余数放在一个集合中,只保留唯一值。

答案 1 :(得分:0)

如果您想从lst中的部分清除列表wastes的元素,这是一般解决方案:

lst = ['a','a #2','a(Old)']
wastes = ['#', '(Old)']

cleaned_set = {
    min([element.split(waste)[0].strip() for waste in wastes]) 
    for element in arr
}

答案 2 :(得分:0)

您可以定义一个辅助函数来应用所有拆分,然后使用集合理解。

例如:

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'}