繁体   English   中英

根据索引和值列表过滤元组列表的最快方法是什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM