Python: подмножество вложенного списка, если совпадает с другим списком - PullRequest
0 голосов
/ 26 февраля 2019

Скажем, я представил строку xm столбцов-матриц в виде вложенного списка питонов, например, 3 строки и 2 столбца:

m = [ [1,2,3], ['a', 'b', 'c'] ]

Какой будет общий и pythonic способ генерировать другую kx m-матрицу(k <= n) со строками, где значения, скажем, во втором столбце имеют совпадения в последовательности (то есть подмножество <code>m).Таким образом, для последовательности ниже есть совпадения для 'a' и 'c':

s = ['j', 'a', 'c', 'e']

Полученная матрица m2 должна быть

m2 = [ [1,3], ['a','c'] ]

Чтоне сработало:

Моя глупая попытка была чем-то увлечена (которая вызвала ошибку / не сработала и менее масштабируема для многих столбцов):

m2 = [ [x, y] for x, y in m if y in s ]

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

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

m2 = [[], []]

for i in range(len(m[1])):
    if m[1][i] in s:
        m2[0].append(m[0][i])
        m2[1].append(m[1][i])
0 голосов
/ 26 февраля 2019

Вы можете zip строк m идентифицировать столбцы, второй элемент которых присутствует в s, и zip столбцов снова для вывода строк:

list(zip(*(c for c in zip(*m) if c[1] in s)))

Возвращает:

[(1, 3), ('a', 'c')]

Если вы хотите, чтобы вывод был списком списков, вы можете отобразить кортежи, сгенерированные с помощью zip, на list:

list(map(list, list(zip(*(c for c in zip(*m) if c[1] in s)))))

Это возвращает:

[[1, 3], ['a', 'c']]

При желании вы можете сначала сделать s набором для повышения эффективности поиска, если в s:

s = set(s)
много предметов
...