假设
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]
但是如果有的话,我正在寻找一种更简单的方法(也可能更快?)。
答案 0 :(得分: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]
答案 1 :(得分:1)
使用enumerate
可以使Pythonic多一点。除此之外,列表理解它几乎是你想要的定义:
>>> 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)
))
答案 2 :(得分:1)
您可以使用del x[::5]
删除列表中的每个第五个元素。它会改变原始列表,所以如果你想要一个新的列表,一定要先复制列表,然后使用变异,e,g
>>> y = x[:]
>>> del y[::5]
>>> print y
[1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19]