[英]remove element from python list based on match from another list
I have list of s3 objects like this:我有这样的 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']
With out using any loop is there any efficient way to achieve this considering large no of elements in list1?考虑到list1中没有大量元素,如果不使用任何循环,是否有任何有效的方法来实现这一点?
You could build a set
from list2
for a faster lookup and use a list comprehension to check for membership using the substring of interest:您可以从list2
构建一个set
以进行更快的查找,并使用列表理解来检查使用感兴趣的 ZE83AED3DDF4667DEC0DAAAACB2BB3BE0BZ 的成员资格:
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']
The substring is obtained through: substring 通过以下方式获得:
s = 'uid=123/2020/06/01/625e2ghvh.parquet'
s.lstrip('uid=').split('/',1)[0]
# '123'
This does the job.这可以完成工作。 For different patterns though, or to also cover slight variations, you could go for a regex.但是,对于不同的模式,或者为了涵盖细微的变化,您可以使用 go 来使用正则表达式。 For this example you'd need something like:对于此示例,您需要以下内容:
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']
This is one way to do it without loops这是一种没有循环的方法
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))
How about this one:这个怎么样:
_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']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.