[英]What is the fastest way to filter list of tuples based on list of indices and values?
我有一个序列列表,如: seq = [(1,2,3,4) , (1,2,4,3) (1,3,2,4) (1,3,4,2)]
,等等..
另一个包含(index , value)
元组(index , value)
及其对应值的列表,如下所示: pos = [(3 , 4) , (1 , 2)]
(在索引 3 处,必须有一个 4。在索引 1 处,必须有 2)。
我将如何以一种方式过滤掉 seq 列表,其中我将删除所有在pos
列表中的相应索引处没有值的元组。 例如,如果我有上面的 seq 和 pos 变量,结果将是: [(1,2,3,4)]
因为它是唯一一个在索引 1 中具有 2 并且在索引 3 中具有 4 的序列。
这是我尝试过的,但它不起作用,并且可能不是最快的方法:
for i in range(len(seq)):
for j in range(len(seq)):
for x in range(len(pos)):
if j == pos[x][0] and seq[i][j] == pos[x][1]:
res.append(temp[i])
您可以使用all
功能:
seq = [(1,2,3,4), (1,2,4,3), (1,3,2,4), (1,3,4,2)]
pos = [(3, 4), (1, 2)]
filtered = [x for x in seq if all(x[i] == v for i, v in pos)]
print(filtered) # [(1, 2, 3, 4)]
如果数据集足够大,您可以使用pandas
可能会更快。 这段代码创建了一个中间数据框,只包含感兴趣的列,与其对应的值进行比较。 然后使用该数据框仅选择所有值都为真的行。
import pandas as pd
seq = [(1,2,3,4), (1,2,4,3), (1,3,2,4), (1,3,4,2)]
pos = [(3 , 4) , (1 , 2)]
seq_df = pd.DataFrame(seq)
filter_df = seq_df[[i for i,_ in pos]] == [v for _,v in pos]
final_df = seq_df[filter_df.all(axis=1)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.