【问题标题】:Delete list element by index from another list value从另一个列表值中按索引删除列表元素
【发布时间】:2016-03-16 11:29:39
【问题描述】:

我有一个算法生成的列表:

L1 = [1, 2]

我有第二个清单:

L2 = [10, 20, 30, 40, 50]

如何通过L1值中的索引删除L2中的元素?

这是我的代码不起作用:

L1 = [1, 2]
L2 = [10, 20, 30, 40, 50]

for i in L1:
    for k,v in enumerate(L2):
        if i == k:
            L2.remove(v)

【问题讨论】:

    标签: python list indexing


    【解决方案1】:

    高效:

    >>> for i in sorted(L1, reverse=True):
    ...     L2.pop(i)
    

    【讨论】:

    • 那行不通。弹出后L2的索引发生了变化
    • @eugene,列表推导式构建一个新列表的成本相当高,并且必须处理 python 中的每个元素。对于 pop/del 方法,要在很长的 L2 和很短的 L1 上快速运行,L2 应该是一个链表实现(以避免 ASM memmove)
    • @julivico,你想到的问题因为reverse=True而避免了。确实如此。
    【解决方案2】:

    如果列表不是特别大,您可以使用列表推导构建一个新列表:

    >>> L1 = [1, 2]
    >>> L2 = [10, 20, 30, 40, 50]
    >>> S1 = set(L1)
    >>> [el for i, el in enumerate(L2) if i not in S1]
    [10, 40, 50]
    

    【讨论】:

    • 当集合在列表comp之前计算时,它带来了比普通not in L1更快的速度优势
    【解决方案3】:

    你可以这样做:

    L1 = [1,2]
    L2 = [10,20,30,40,50]
    
    L2 = [x for x in L2 if L2.index(x) not in L1]
    

    输出:

    [10, 40, 50]
    

    【讨论】:

      【解决方案4】:

      建立一个新列表:

      In[9]: L1 = [1,2]
      L2 = [10,20,30,40,50]
      In[10]: [x for i,x in enumerate(L2) if i not in L1]
      Out[10]: [10, 40, 50]
      

      【讨论】: