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