簡體   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