【问题标题】:Fastest way to remove an item from each sublist with max length in a list of lists从列表列表中具有最大长度的每个子列表中删除项目的最快方法
【发布时间】:2017-05-06 14:03:02
【问题描述】:

给定一个列表列表:

l = [[],[1,2,3],[1,2,3,4],[1,2],[3,1,4,2,0],[],[2]]

我通过以下方式从每个子列表中删除项目 2

l = [[j for j in i if j !=2] for i in l]

有没有更快的方法来做同样的事情?

【问题讨论】:

    标签: performance python-2.7 list


    【解决方案1】:

    有趣的问题!

    我尝试了 3 个不同的版本,并且(对于您的列表 - 不知道一般情况或一般情况)通过首先检查 2 是否在子列表中获得了微小(!)加速。我的尝试并不详尽:

    from timeit import timeit
    n_timeit = 1000
    
    
    l = [[],[1,2,3],[1,2,3,4],[1,2],[3,1,4,2,0],[],[2]]
    
    
    def f1(l):
        return [[j for j in i if j != 2] for i in l]
    
    
    def f2(l):
        return [sublist if 2 not in sublist
                else list(filter(lambda x: x != 2, sublist)) for sublist in l]
    
    
    def f3(l):
        return [sublist if 2 not in sublist
                else [item for item in sublist if item != 2] for sublist in l]
    
    
    t1 = timeit(setup='from __main__ import f1, l',
                stmt='f1(l)',
                number=n_timeit)
    t2 = timeit(setup='from __main__ import f2, l',
                stmt='f2(l)',
                number=n_timeit)
    t3 = timeit(setup='from __main__ import f3, l',
                stmt='f3(l)',
                number=n_timeit)
    
    print(t1)  # 0.00488
    print(t2)  # 0.00943
    print(t3)  # 0.00466
    

    哦,在python3上测试过;不知道这在 python2 上的表现如何。

    请注意您的方法和我的方法之间的区别:在您的方法中,无论如何您都会创建新列表;在我的中,您会得到对不包含 2 而不是新列表的列表的引用。

    【讨论】:

      猜你喜欢
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-03
      • 1970-01-01
      • 2010-12-13
      相关资源
      最近更新 更多