python:如果在另一个列表中匹配,则子集嵌套列表

python: subset a nested list if matches in another list

假设我将 n 行 x m 列矩阵表示为嵌套 python 列表,例如3 行 2 列:

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

生成另一个 k x m 矩阵 (k <= n) 的通用和 pythonic 方法是什么m 的子集)。 因此,对于下面的序列,存在 'a' 和 'c':

的匹配项
s = ['j', 'a', 'c', 'e']

结果矩阵m2应该是

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

什么不起作用:

我的愚蠢尝试一直在进行(生成 error/did 无效,并且对于许多列而言可扩展性较差):

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

您可以 zip m 的行来识别其第二项出现在 s 中的列,然后再次 zip 列以输出行:

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

这个returns:

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

如果需要输出为列表的列表,可以将zip生成的元组映射到list:

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

这个returns:

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

如果s中有很多项目,您可以选择先将s设置为一个集合以提高查找效率:

s = set(s)

试试这个:

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