python - 如何根据多个条件过滤列表?

标签 python list

我有以下列表:

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

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"
]

如何只过滤mylist中与target_list对应的记录?预期结果是:

  "FOLD/AAA.RST.12345.TXT"
  "FOLD/AAA.RST.87589.TXT"

以下掩码用于过滤mylist

xxx/yyy.zzz.nnn.txt

如果xxxyyyzzztarget_list一致,则应该选择该记录。否则它应该从结果中删除。

如何在不使用 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 的信息来做最少的工作:总时间是 O(N_target_list) + O(N),因为集合查找是 O(1 ) 平均。
  • 不使用全局变量。易于测试。
  • 不使用嵌套 for 循环
def prefixes(target):
    """ 
    >>> prefixes("FOLD/AAA.RST.TXT")
    ('FOLD', 'AAA', 'RST')

    >>> prefixes("FOLD/AAA.RST.12345.TXT")
    ('FOLD', 'AAA', 'RST')
    """
    x, rest = target.split('/')
    y, z, *_ = rest.split('.')
    return x, y, z

def matcher(target_list):
    targets = set(prefixes(target) for target in target_list)
    def is_target(t):
        return prefixes(t) in targets
    return is_target

然后,你可以这样做:

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

关于python - 如何根据多个条件过滤列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59040485/

相关文章:

python - python中加密密码最安全的方法?

python - 如何使用Python更改Excel中的列格式

c# - 如何在 C# 中获取子列表

python - 根据来自另一个列表的 True/False 过滤列表中的元素

c++ - 对象列表中的变量不会改变

引用自身的 Python 列表 - 它是如何工作的?

python - 获取 URL 列表的内容

python - scrapy混合来自不同页面的项目字段

python - 将数字添加到多维数组python

java - 有没有办法使用 java 8 替换列表中的 Map 值?