@stepan-neretin7

Как сверить два массива?

Надо сверить два массива с учетом порядка и с учетом что если элемент в первом массиве = -1, то во втором он может быть любым.
table = [
    [1, 0, -1],
    [-1, 0, 0],
    [-1, 0, 0]
]
tb = [[0, 0, 0], [0, 1, 0], [1, 1, 0], [1, 1, 1]]

Например есть матрица table и tb
Надо проверить что все элементы массива из table есть в tb с учетом последовательности и -1
Важно примечание: -1 могут встречаться только в table
Если бы не этот нюанс с -1, то я бы делал так
if all(t in tb for t in table):
   ...

Подскажите как это сделать намного красивей? Желательно вообще в одну строчку, но понятно не в ущерб читаемости
  • Вопрос задан
  • 205 просмотров
Пригласить эксперта
Ответы на вопрос 3
MinTnt
@MinTnt
Ну...
table = [
    [1, 0, -1],
    [-1, 0, 0],
    [-1, 0, 0]
]
tb = [[0, 0, 0], [0, 1, 0], [1, 1, 0], [1, 1, 1]]


n = [[i for k,i in enumerate(x) if k not in d] in [[i for k,i in enumerate(l) if k not in d] for l in tb] for x, d in zip(table, [[k for k,i in enumerate(x) if i==-1] for x in table])]
print(n)
Ответ написан
Комментировать
aRegius
@aRegius
Python Enthusiast
from itertools import compress


def equal_but_one(data, storage, skip_value=-1):
	  mask = [number != skip_value  for number in data]
	  data_compressed = list(compress(data, mask))
	  return data_compressed in (list(compress(item, mask)) for item in storage)

all(equal_but_one(data, tb) for data in table)
Ответ написан
longclaps
@longclaps
Однострочники хреновы
for row in table:
    print(not all(any((a - b) * (a + 1) for a, b in zip(row, r)) for r in tb))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы