我有以下列表:
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
如果xxx
、yyy
和zzz
与target_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/