Как получить те элементы, которые находятся в одном и том же положении в двух 2D-матрицах в Python, используя фильтр?

#python #list #filter

#python #Список #Фильтр

Вопрос:

Я пытаюсь получить элементы в виде списка, если какой-либо из них находится в одной и той же позиции в двух 2D-матрицах.

Давайте рассмотрим матрицу A и матрицу B

 A = [[1, 2, 3],[4, 5, 6],[7, 8, 9]]
B = [[0, 2, 5],[6, 2, 4],[7, 8, 1]]
 

Результирующий список должен быть

 C = [2, 7, 8]
 

Я пытался использовать фильтр, но он не работает.

 def find(A):
    for i in range(3):
        for j in range(3):
            if A[i][j] == B[i][j]:
                return A[i][j]
            else:
                return False

A = [[1, 2, 3],[4, 5, 6], [7, 8, 9]]
B = [[0, 2, 5],[6, 2, 4], [7, 8, 1]]

C = filter(find, A)

for element in C:
    print(element)
 

Примечание: Пожалуйста, используйте фильтр для достижения цели.

Ответ №1:

Решение с использованием фильтра:

 def find(L):
            A, B = L
            if A == B:
                return True
            else:
                return False

A = [[1, 2, 3],[4, 5, 6], [7, 8, 9]]
B = [[0, 2, 5],[6, 2, 4], [7, 8, 1]]

# flatten lists
A = [item for row in A for item in row]
B = [item for row in B for item in row]

C = filter(find, zip(A,B))

# filter returns a tuple for each row but we only want the single element
C = [item[0] for item in C]

print(list(C))
 

Дает нам

 [2, 7, 8]
 

Комментарии:

1. Спасибо за ваш ответ!

Ответ №2:

Попробуйте это,

 def func(t):
    return True if t[0] == t[1] else False

A = [[1, 2, 3],[4, 5, 6],[7, 8, 9]]
B = [[0, 2, 5],[6, 2, 4],[7, 8, 1]]

C = [item1 for lst1, lst2 in zip(A, B) for item1, item2 in filter(func, zip(lst1, lst2))]
 
 >>> C
[2, 7, 8]
 

Ответ №3:

Основной ответ

Сначала мы перебираем A и B, i и z теперь содержат внутренние списки.

Затем мы перебираем эти внутренние списки, используя g и q, если они равны, мы добавляем их в пустой список.

 to_fill = []
for i,z in zip(A,B):
    for g,q in zip(i,z):
        if g==q:
            to_fill.append(g)
 

Адаптируйте его по своему усмотрению.

Комментарии:

1. Он может быть написан более компактным способом, однако для образовательных целей лучше рассматривать его как цикл.

2. На самом деле, я хочу получить его с помощью функции filter .

3. @user3804152 вы никогда не упоминали об этом в своем вопросе. вы сказали, что попробовали фильтр, но он не сработал (очевидно)

4. Извините за это. Я думал, это понятно! Я редактирую.

Ответ №4:

Наиболее эффективный способ достижения желаемого — использовать numpy:

 import numpy as np
A = np.asarray(A)
B = np.asarray(B)
C = A[A==B]
 

Комментарии:

1. Спасибо. Но я хочу добиться этого с помощью фильтра.