根据每个列表第一个元素从列表列表中删除项目

时间:2018-04-05 07:27:16

标签: python python-3.x list

鉴于:

a = [[1,2],[3,4],[5,6],[7,8]]
b = 3

我想删除ab作为第一项的项目。因此,在这种情况下,我们会移除[3,4]来提供:

a = [[1,2],[5,6],[7,8]]

我目前的代码是:

if b in [i[0] for i in a]:
    pos = [i[0] for i in a].index(b)
       del a[pos]

这有效,但速度很慢。有什么更好的方法呢?

编辑: 我之前没有测试过性能,所以我可能会做错了,但我得到了这个:

def fun1():
    lst = [[x, 2*x] for x in range(1000000)]
    lst = [x for x in lst if x[0] != 500]
    return lst

def fun2():
    lst = [[x, 2*x] for x in range(1000000)]
    for i in reversed(range(len(lst))):
        if lst[i][0] == 500:
            del lst[i]
    return lst

cProfile.runctx('fun1()', None, locals())
        6 function calls in 0.460 seconds

cProfile.runctx('fun2()', None, locals())
        6 function calls in 0.502 seconds

4 个答案:

答案 0 :(得分:10)

反向删除a,就地修改:

for i in reversed(range(len(a))):
    if a[i][0] == 3:
        del a[i]

就地修改意味着这样做更有效率,因为它不会创建新列表(如列表理解那样)。

由于OP要求一个高性能的解决方案,这里的两个最高投票答案之间的timeit比较。

设置 -

a = np.random.choice(4, (100000, 2)).tolist()

print(a[:5])
[[2, 1], [2, 2], [3, 2], [3, 3], [3, 1]]

列表理解 -

%timeit [x for x in a if x[0] != b]
11.1 ms ± 685 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

反向删除 -

%%timeit
for i in reversed(range(len(a))):
    if a[i][0] == 3:
        del a[i]

10.1 ms ± 146 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)

他们真的很接近,但反向删除在性能上有1UP,因为它不必在内存中生成新列表,就像列表理解那样。

答案 1 :(得分:7)

您可以使用列表理解:

>>> a = [[1,2],[3,4],[5,6],[7,8]]
>>> b = 3
>>> a = [x for x in a if x[0] != b]
>>> a
[[1, 2], [5, 6], [7, 8]]

答案 2 :(得分:1)

lib.navaside = HMENU
lib.navaside {
  special = directory
  special.value.field = uid
  1 = TMENU
  1 {
    wrap = <ul class="menu">|</ul>
    NO = 1
    NO {
      wrapItemAndSub = <li class="menu__item">|</li>
      wrapItemAndSub.insertData = 1
    }
  }
}

这个怎么样?

输出

  

[[1,2],[5,6],[7,8]]

答案 3 :(得分:1)

如果您的列表很小,那么您也尝试过滤,

a = [[1,2],[3,4],[5,6],[7,8]]
b = 3

print(list(filter(lambda x:x[0]!=b,a)))

输出:

[[1, 2], [5, 6], [7, 8]]