从 Python 数组切割偶数/奇数行的最短方法?

或者,一个更一般的问题是,如何切割一个数组来得到每个 n 行,所以对于偶数/奇数,你会想要跳过一行,但在一般情况下,你会想要得到每个 n 行,跳过 n-1行。

98872 次浏览

Assuming you are talking about a list, you specify the step in the slice (and start index). The syntax is list[start:end:step].

You probably know the normal list access to get an item, e.g. l[2] to get the third item. Giving two numbers and a colon in between, you can specify a range that you want to get from the list. The return value is another list. E.g. l[2:5] gives you the third to sixth item. You can also pass an optional third number, which specifies the step size. The default step size is one, which just means take every item (between start and end index).

Example:

>>> 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]

See lists in the Python tutorial.

If you want to get every n-th element of a list (i.e. excluding the first element), you would have to slice like l[(n-1)::n].

Example:

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

Now, getting every third element would be:

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

If you want to include the first element, you just do l[::n].

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

where arr is a list, and n slices are required.

This is more for me as a complete example ;)

>>> 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]

example for indices 0,2,4... of myArr

myArr[list(range(0,len(myArr),2))]

example for indices 1,3,5... of myArr

myArr[list(range(1,len(myArr)+1,2))]

you can manipulate it anyway you want with the step parameter, in this case it is equal to 2. hope this helped