17

这类似于其他一些问题(Explicitly select items from a Python list or tupleGrabbing specific indices of a list in Python),但我希望做相反的事情:

什么是指定要排除而不是选择的索引列表/元组的干净方法?我正在考虑类似于 R 或 MATLAB 的东西,您可以在其中指定要排除的索引,例如:

vector1 <- c('a', 'b', 'c', 'd')
vector2 <- vector1[-1] # ['b', 'c', 'd']
vector3 <- vector1[c(-1, -2)] # ['c', 'd']

有没有在 Python 中完成同样事情的好方法?抱歉,如果这是一个骗局,我不确定要搜索什么。

4

6 回答 6

22
>>> to_exclude = {1, 2}
>>> vector = ['a', 'b', 'c', 'd']
>>> vector2 = [element for i, element in enumerate(vector) if i not in to_exclude]

这里的技巧是:

  • 使用列表推导将一个列表转换为另一个列表。(您也可以使用该filter函数,特别是如果您要过滤的谓词已经作为具有好名字的函数存在。)
  • 用于enumerate将每个元素及其索引放在一起。
  • in对任何类型Set或* 类型使用运算符Sequence来决定要过滤哪些类型。(如果有很多值,Aset是最有效的,并且可能在概念上是正确的答案......但对于少数几个来说真的没关系;如果你已经有一个包含 4 个索引的列表或元组,那就是一个“SetSequence”,所以你可以使用它。)

* 从技术上讲,任何Container人都可以。但大多数Container不是 aSetSequence在这里会很傻的 s。

于 2013-08-26T18:45:27.647 回答
8
import numpy
target_list = numpy.array(['1','b','c','d','e','f','g','h','i','j'])
to_exclude = [1,4,5]
print target_list[~numpy.in1d(range(len(target_list)),to_exclude)]

因为 numpy 很有趣

于 2013-08-26T18:49:48.797 回答
4

利用np.delete

In [38]: a
Out[38]: array([ 4,  5,  6,  7,  8,  9, 10, 11, 12, 13])

In [39]: b
Out[39]: [3, 4, 5, 9]

In [40]: a[b]
Out[40]: array([ 7,  8,  9, 13])

In [41]: np.delete(a, b)
Out[41]: array([ 4,  5,  6, 10, 11, 12])
于 2017-06-20T07:39:36.343 回答
3

使用enumerate()并排除您要删除的任何索引:

[elem for i, elem in enumerate(inputlist) if i not in excluded_indices]

就性能而言,如果excluded_indicesset.

于 2013-08-26T18:45:14.257 回答
1
numpy.delete(original_list,index_of_the_excluded_elements)

请注意,在 python 中,索引从 0 开始,因此对于问题中的示例,代码应为:

import numpy as np
vector1=['a', 'b', 'c', 'd']
vector2 =np.delete(vector1,[0]) # ['b', 'c', 'd']
vector3 =np.delete(vector1,[0,1]) # ['c', 'd']
于 2020-01-20T10:28:55.500 回答
0

我将采用不同的方法,使用itemgetter. 就是图个好玩儿 :)

from operator import itemgetter

def exclude(to_exclude, vector):
    "Exclude items with particular indices from a vector."
    to_keep = set(range(len(vector))) - set(to_exclude)
    return itemgetter(*to_keep)(vector)
于 2016-06-06T14:44:34.740 回答