根据与另一个列表的匹配,从python列表中删除元素

时间:2020-06-26 10:48:41

标签: python list

我有这样的s3对象列表:

list1 = ['uid=123/2020/06/01/625e2ghvh.parquet','uid=876/2020/04/01/hgdshct7.parquet','uid=0987/2019/03/01/323dc.parquet']

list2 = ['123','876']

result_list = ['uid=0987/2019/03/01/323dc.parquet']

不使用任何循环,考虑到list1中没有大量元素,是否有任何有效的方法来实现这一目标?

3 个答案:

答案 0 :(得分:1)

您可以从set构建list2来进行快速查找,并使用列表推导使用感兴趣的子字符串检查成员资格:

list1 = ['uid=123/2020/06/01/625e2ghvh.parquet','uid=876/2020/04/01/hgdshct7.parquet',
         'uid=0987/2019/03/01/323dc.parquet']
list2 = ['123','876']
set2 = set(list2)

[i for i in list1 if i.lstrip('uid=').split('/',1)[0] not in set2]
# ['uid=0987/2019/03/01/323dc.parquet']

子字符串是通过以下方式获得的:

s = 'uid=123/2020/06/01/625e2ghvh.parquet'
s.lstrip('uid=').split('/',1)[0]
# '123'

这完成了工作。但是,对于不同的模式,或者为了涵盖微小的变化,您可以使用正则表达式。对于此示例,您将需要以下内容:

import re
[i for i in list1 if re.search(r'^uid=(\d+).*?', i).group(1) not in set2]
# ['uid=0987/2019/03/01/323dc.parquet']

答案 1 :(得分:1)

这是无循环的一种方法

def filter_function(item):
    uid = int(item[4:].split('/')[0])
    if uid not in list2:
        return True
    return False


list1 = ['uid=123/2020/06/01/625e2ghvh.parquet','uid=876/2020/04/01/hgdshct7.parquet','uid=0987/2019/03/01/323dc.parquet']
list2 = [123, 876]

result_list = list(filter(filter_function, list1))

答案 2 :(得分:1)

这个怎么样?

_list2 = [f'uid={number}' for number in list2]
result = [item for item in list1 if not any([item.startswith(i) for i in _list2])]  # ['uid=0987/2019/03/01/323dc.parquet']
相关问题