【问题标题】:python: subset a nested list if matches in another listpython:如果在另一个列表中匹配,则子集嵌套列表
【发布时间】:2019-02-25 21:35:59
【问题描述】:

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

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

生成另一个 k x m 矩阵 (k 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 ]

【问题讨论】:

    标签: python list nested subset traversal


    【解决方案1】:

    您可以zipm 的行来识别第二个项目存在于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)
    

    【讨论】:

    • 啊抱歉-我在接受时没有注意。我试图只选择m 的第 2 列。当s = ['j', 'a', 'c', 'e', 2] 时,您的代码错误地返回[(1, 2, 3), ('a', 'b', 'c')],因为1 在m 的第一列中有匹配项。
    • 那么2的列数是固定数吗?还是最后一栏?
    • 让我们说它是固定的
    • 完美男人!当我尝试使用这些理解时,我头晕目眩。很好的解释!
    【解决方案2】:

    试试这个:

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

    【讨论】:

      猜你喜欢
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 2023-03-29
      • 2019-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多