删除元素后将索引更新为Python列表

时间:2014-10-21 16:44:40

标签: python list

假设我有一个整数列表x。我还有另外两个列表z1z2,每个列表都有x个单独的索引,其中z1中的任何元素都不等于{{1}中的元素}}。我想删除与z2中的索引相对应的x的所有元素,以留下列表z1。然后,我想更新y中的索引,使它们与z2中的相应元素相对应,就像删除之前一样。

举个例子:

x

这应该产生:

x = [3, 4, 6, 8, 9, 10, 13, 14]
z1 = [0, 5, 7]
z2 = [1, 2, 6]

y = []
for i in x:
    if i not in z1:
        y.append(x[i])

# Now I need to update the values of z2 ...

我怎样才能优雅地做到这一点?

2 个答案:

答案 0 :(得分:2)

  1. 设置z1一套。这将有助于提高第2步的性能。

    >>> z1 = set(z1)
    
  2. 根据z1

    获取x的所有匹配元素
    >>> y = [item for index, item in enumerate(x) if index not in z1]
    
  3. x获取旧值并形成一组

    >>> old = {x[item] for item in z2}
    
  4. 然后获取y的所有值的索引(如果数据不在old中),以获取z2

    >>> z2 = [index for index, item in enumerate(y) if item in old]
    
  5. 那就是它。

    >>> y
    [4, 6, 8, 9, 13]
    >>> z2
    [0, 1, 4]
    

答案 1 :(得分:0)

>>> x = [3, 4, 6, 8, 9, 10, 13, 14]
>>> z1 = [0, 5, 7]
>>> z2 = [1, 2, 6]
>>>
>>> z2_values = [x[i] for i in z2]
>>> y = [item for i, item in enumerate(x) if i not in z1]
>>> value_to_indexes = {v: i for i, v in enumerate(y)}
>>> z2 = [value_to_indexes[v] for v in z2_values]
>>> y
[4, 6, 8, 9, 13]
>>> z2
[0, 1, 4]