繁体   English   中英

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

[英]python: subset a nested list if matches in another list

假设我已经将xm列矩阵表示为嵌套的python列表,例如3行和2列:

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

生成具有行的行的另一个kx m-matrix(k <= n)的通用和pythonic方法,例如,第二列中的值在序列中匹配(这是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 ]

您可以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)

尝试这个:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM