Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据多个条件筛选列表?_Python_List - Fatal编程技术网

Python 如何根据多个条件筛选列表?

Python 如何根据多个条件筛选列表?,python,list,Python,List,我有以下清单: target_list = ["FOLD/AAA.RST.TXT"] 及 如何仅筛选与目标列表相对应的mylist记录?预期结果是: "FOLD/AAA.RST.12345.TXT" "FOLD/AAA.RST.87589.TXT" 下面的掩码用于过滤mylist 如果xxx、yyy和zzz与目标_列表一致,则应选择该记录。否则,应将其从结果中删除 如果不使用for循环,如何解决此任务 selected_list = [] for t in target_list:

我有以下清单:

target_list = ["FOLD/AAA.RST.TXT"]

如何仅筛选与目标列表相对应的mylist记录?预期结果是:

  "FOLD/AAA.RST.12345.TXT"
  "FOLD/AAA.RST.87589.TXT"
下面的掩码用于过滤mylist

如果xxx、yyy和zzz与目标_列表一致,则应选择该记录。否则,应将其从结果中删除

如果不使用for循环,如何解决此任务

selected_list = []
for t in target_list:
   r1 = l.split("/")[0]
   a1 = l.split("/")[1].split(".")[0]
   b1 = l.split("/")[1].split(".")[1]

   for l in mylist:
      r2 = l.split("/")[0]
      a2 = l.split("/")[1].split(".")[0]
      b2 = l.split("/")[1].split(".")[1]

      if (r1==r2) & (a1==a2) & (b1==b2):
         selected_list.append(l)

定义用于筛选值的函数:

target_list = ["FOLD/AAA.RST.TXT"]

def keep(path):
    template = get_template(path)
    return template in target_list

def get_template(path):
    front, numbers, ext = path.rsplit('.', 2)
    template = '.'.join([front, ext])
    return template
这将使用反向搜索字符串并在给定字符上拆分它的。在这种情况下。参数2表示它最多只执行两次拆分。这给了我们三个部分,前面、数字和分机:

>>> 'FOLD/AAA.RST.12345.TXT'.rsplit('.', 2)
['FOLD/AAA.RST', '12345', 'TXT']
我们把它们分配到前面,数字和外部

然后,我们使用

这就是get_模板返回的结果:

我们可以这样使用它:

mylist = [
    "FOLD/AAA.RST.12345.TXT",
    "FOLD/BBB.RST.12345.TXT",
    "RUNS/AAA.FGT.12345.TXT",
    "FOLD/AAA.RST.87589.TXT",
    "RUNS/AAA.RST.11111.TXT"
]

from pprint import pprint

pprint(filter(keep, mylist))
输出:

['FOLD/AAA.RST.12345.TXT'
 'FOLD/AAA.RST.87589.TXT']

定义用于筛选值的函数:

target_list = ["FOLD/AAA.RST.TXT"]

def keep(path):
    template = get_template(path)
    return template in target_list

def get_template(path):
    front, numbers, ext = path.rsplit('.', 2)
    template = '.'.join([front, ext])
    return template
这将使用反向搜索字符串并在给定字符上拆分它的。在这种情况下。参数2表示它最多只执行两次拆分。这给了我们三个部分,前面、数字和分机:

>>> 'FOLD/AAA.RST.12345.TXT'.rsplit('.', 2)
['FOLD/AAA.RST', '12345', 'TXT']
我们把它们分配到前面,数字和外部

然后,我们使用

这就是get_模板返回的结果:

我们可以这样使用它:

mylist = [
    "FOLD/AAA.RST.12345.TXT",
    "FOLD/BBB.RST.12345.TXT",
    "RUNS/AAA.FGT.12345.TXT",
    "FOLD/AAA.RST.87589.TXT",
    "RUNS/AAA.RST.11111.TXT"
]

from pprint import pprint

pprint(filter(keep, mylist))
输出:

['FOLD/AAA.RST.12345.TXT'
 'FOLD/AAA.RST.87589.TXT']

您可以定义一个过滤器生成函数来预处理目标列表。这样做的好处是:

通过缓存集合中有关目标列表的信息来完成最小的工作:由于集合查找的平均值为O1,所以总时间在\u target\u list+ON上。 不使用全局变量。易于测试。 不使用嵌套for循环 然后,你可以做:

>>> list(filter(matcher(target_list), mylist))
['FOLD/AAA.RST.12345.TXT', 'FOLD/AAA.RST.87589.TXT']

您可以定义一个过滤器生成函数来预处理目标列表。这样做的好处是:

通过缓存集合中有关目标列表的信息来完成最小的工作:由于集合查找的平均值为O1,所以总时间在\u target\u list+ON上。 不使用全局变量。易于测试。 不使用嵌套for循环 然后,你可以做:

>>> list(filter(matcher(target_list), mylist))
['FOLD/AAA.RST.12345.TXT', 'FOLD/AAA.RST.87589.TXT']

可以使用正则表达式定义模式,并检查字符串是否与该模式匹配

在这种情况下,拆分目标并在xxx/yyy.zzz之间插入\d+。和.txt部分。使用此作为模式

模式\d+表示任意位数。模式的其余部分将基于xxx/yyy.zzz和.txt的文本值创建。由于句点在正则表达式中有特殊意义,我们必须用\来逃避它


如果模式不匹配,re.match将返回None。

您可以使用正则表达式定义模式,并检查字符串是否匹配该模式

在这种情况下,拆分目标并在xxx/yyy.zzz之间插入\d+。和.txt部分。使用此作为模式

模式\d+表示任意位数。模式的其余部分将基于xxx/yyy.zzz和.txt的文本值创建。由于句点在正则表达式中有特殊意义,我们必须用\来逃避它

如果模式不匹配,则re.match返回无。

为什么不使用filter+lambda函数:

import re
result=list(filter(lambda item: re.sub(r'.[0-9]+', '', item) == target_list[0], mylist))
一些评论:

方法是从比较中排除数字。那么在 lambda函数,对于我们替换为数字的每个mylist项, 然后与target_list中的唯一项target_list[0]进行比较。 筛选器将匹配lambda函数为True的所有项 将所有内容包装在列表中,以从过滤器对象转换为列表 对象 为什么不使用filter+lambda函数:

import re
result=list(filter(lambda item: re.sub(r'.[0-9]+', '', item) == target_list[0], mylist))
一些评论:

方法是从比较中排除数字。那么在 lambda函数,对于我们替换为数字的每个mylist项, 然后与target_list中的唯一项target_list[0]进行比较。 筛选器将匹配lambda函数为True的所有项 将所有内容包装在列表中,以从过滤器对象转换为列表 对象
好的,发布你的代码为什么不能使用for循环?你能接受列表理解吗?@RomanPerekhrest:请看我的代码。如果我正在寻找一个不同的解决方案,我不知道为什么这里需要它。你想检查我是否做了家庭作业吗?:@NicholasM:请看我的代码。在我看来,这看起来很糟糕。我正在寻找一个更优雅的解决方案。为什么不想使用循环呢?是否要声明模式并过滤结果?好的,发布代码为什么不能使用for循环?你能接受列表理解吗?@RomanPerekhrest:请看我的代码。如果我正在寻找一个不同的解决方案,我不知道为什么这里需要它。你想检查我是否做了家庭作业吗?:@NicholasM:请看我的代码。在我看来,这看起来很糟糕。我正在寻找一个更优雅的解决方案。为什么不想使用循环呢?是否要声明模式并筛选结果?谢谢。你能评论一下这个功能吗?谢谢。你能评论一下这个功能吗?