从python数组中切割偶数/奇数行的最短方法是什么?


77

或者,一个更笼统的问题是,如何对数组进行切片以获取每第n行,因此对于偶数/奇数,您希望跳过一行,但通常情况下,您希望获取每n- th行,跳过n-1行。


1
我意识到我可以用它做一个循环,但是我想知道我是否可以只用一行完成它
fatcat 2011年

好问题。这里的答案也帮助了我。太好了
Siyah

Answers:


164

假设您在谈论列表,则在切片中指定步骤(并开始索引)。语法为list[start:end:step]

您可能知道正常列表访问权限可以获取某项,例如l[2]获取第三项。给定两个数字和一个冒号,您可以指定要从列表中获取的范围。返回值是另一个列表。例如,l[2:5]给您第三到第六项。您还可以传递一个可选的第三个数字,该数字指定步长。默认的步长为1,仅表示获取每个项目(在开始索引和结束索引之间)。

例:

>>> l = range(10)
>>> l[::2]         # even  - start at the beginning at take every second item
[0, 2, 4, 6, 8]
>>> l[1::2]        # odd - start at second item and take every second item
[1, 3, 5, 7, 9]

请参阅Python教程中的列表

如果要获取列表的n第n个元素(即不包括第一个元素),则必须像切片l[(n-1)::n]

例:

>>> l = range(20)
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

现在,获取第三个元素将是:

>>> l[2::3]
[2, 5, 8, 11, 14, 17]

如果要包括第一个元素,只需执行l[::n]


我从未见过。第一个数字是初始索引,最后一个是步骤?之间有什么关系::吗?还是他们都是不同于的运算符:?如果我l[::1]得到原始阵列,那?
fatcat 2011年

1
@fatcat-docs.python.org/ library/…,请参阅注释3和5
Jeremy Brown,

@fatcat:是的,您将获得原始数组。我会说更多的时候,您只会看到从开始到结束索引的一个片段,例如l[2:5]。该步骤是可选的。
Felix Kling

1

作为一个完整的例子,这对我来说更多;)

>>> import itertools
>>> ret = [[1,2], [3,4,5,6], [7], [8,9]]
>>> itertools.izip_longest(*ret)
>>> [x for x in itertools.chain.from_iterable(tmp) if x is not None]
[1, 3, 7, 8, 2, 4, 9, 5, 6]

-1
> map(lambda index: arr[index],filter(lambda x: x%n == 0,range(len(arr))))

arr列表在哪里,并且n需要切片。


1
-1map()与和filter()一起使用lambda。不鼓励/缓慢执行此操作,应始终使用列表理解来完成。
ThiefMaster

1
是否有任何实验可以证明这一主张?
ajmartin

1
我认为在python邮件列表档案中的某个地方,有来自guido van rossum的帖子。无论如何,这是显而易见的,因为它是函数调用与无函数调用。除非您使用无堆栈调用函数非常昂贵
否则
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.