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])
假设我将 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])