代码之家  ›  专栏  ›  技术社区  ›  Caner

一次过滤2个列表(日志(N)复杂度)

  •  2
  • Caner  · 技术社区  · 8 年前

    我有两个类似的列表(长度相等,填充有 string 值):

    a = ["W", "", "X", "", "Y", "Z"]
    b = ["a", "b", "c", "d", "e", "f"]
    

    我想从列表中删除元素 a ,如果元素为空 一串 。此外,我想从 b 列表(具有相同的索引)。因此,上述示例所需的结果列表为:

    a = ["W", "X", "Y", "Z"]
    b = ["a", "c", "e", "f"]
    

    我可以用几个 for 循环,但我想知道是否可以用更有效的方式(列出理解)?原因是我正在处理非常大的列表(约450万个元素),效率至关重要。

    2 回复  |  直到 8 年前
        1
  •  3
  •   Chris_Rands    8 年前

    你可以使用 zip() 要两次转换数据,请执行以下操作:

    >>> a, b = zip(*((av, bv) for av, bv in zip(a,b) if av))
    >>> a
    ('W', 'X', 'Y', 'Z')
    >>> b
    ('a', 'c', 'e', 'f')
    
        2
  •  1
  •   Niek de Klein    8 年前
    a = ["W", "", "X", "", "Y", "Z"]
    b = ["a", "b", "c", "d", "e", "f"]
    
    aNew,bNew = zip(*[(a[i], b[i]) for i in range(len(a)) if len(a[i]) > 0])
    
    print(aNew) 
    #('W', 'X', 'Y', 'Z')
    print(bNew)
    #('a', 'c', 'e', 'f')