1

认为

x = range(20)
k = 5
x_kth = x[::5]

这给了我0,5,10,15 etc 有没有简单的方法来获取 x 中的非第 k 个元素?

x_nonkth = [1,2,3,4,6,7,8,9,11 etc

我知道我能做到

x_nonkth = [x[i] for i in range(len(x)) if i%k]

但我正在寻找一种更简单的方法(并且可能更快?)如果有的话。

4

3 回答 3

1

您可以利用set差异:-

>>> x = range(20)
>>> k = 5
>>> list(set(x) - set(x[::k]))
[1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19]
于 2012-12-02T18:50:56.100 回答
1

使用enumerate. 除此之外,该列表理解几乎就是您想要的定义:

>>> lst = range(20)
>>> [e for i, e in enumerate(lst) if i % 5]
[1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19]

另一种方法是获取切片并将它们链接起来,但我认为这不会更容易(如果k很大并且列表很长,可能会更快):

from itertools import islice, chain

def without_kth(lst, k):
    return list(chain.from_iterable(
        islice(lst, i+1, i+k) for i in range(0, len(lst), k)
    ))
于 2012-12-02T19:05:15.410 回答
1

您可以使用del x[::5]删除列表中的每五个元素。它会改变原始列表,所以如果你想要一个新列表,请务必先复制列表然后使用突变,例如

>>> y = x[:]
>>> del y[::5]
>>> print y
[1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19]
于 2012-12-02T20:01:50.383 回答