Каков самый быстрый способ отфильтровать список кортежей на основе списка индексов и значений?

#python #list

#питон #Список

Вопрос:

У меня есть список последовательностей, таких как: seq = [(1,2,3,4) , (1,2,4,3) (1,3,2,4) (1,3,4,2)] , и т.д..

И еще один список, содержащий кортежи (index , value) индексов и соответствующие им значения, например: pos = [(3 , 4) , (1 , 2)] (в индексе 3 должно быть 4. В индексе 1 должно быть 2).

Как бы мне отфильтровать список seq таким образом, чтобы я удалил все кортежи, которые не имеют значений в соответствующих индексах в pos списке. Так, например, если бы у меня были вышеупомянутые переменные seq и pos, результат был бы следующим: [(1,2,3,4)] потому что это единственная последовательность, которая имеет 2 в индексе один и 4 в индексе 3.

Вот что я пробовал, но это не работает и, вероятно, не самый быстрый способ:

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

Ответ №1:

Вы можете использовать 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)]
 

Ответ №2:

Вы можете использовать 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)]