Pythonic方式获取序列的第一个和最后一个元素

时间:2012-08-22 12:54:39

标签: python python-3.x

获取序列的第一个和最后一个元素的最简单,最简洁的方法是什么?例如,我有一个序列[1, 2, 3, 4, 5],我希望通过某种切片魔法得到[1, 5]。到目前为止我想出的是:

l = len(s)
result = s[0:l:l-1]

我实际上需要这个更复杂的任务。我有一个3D numpy数组,它是立方的(即大小为NxNxN,其中N可能不同)。我想要一种简单快捷的方法来获取包含源数组顶点值的2x2x2数组。上面的示例是我的任务的过度简化的1D版本。

6 个答案:

答案 0 :(得分:6)

使用此:

result = [s[0], s[-1]]

答案 1 :(得分:3)

这将为您提供序列中第一个和最后一个元素的列表

 result = [s[0], s[-1]]

或者,这会给你一个元组

 result = s[0], s[-1]

答案 2 :(得分:3)

由于你使用的是numpy数组,你可能想要使用花哨的索引:

a = np.arange(27)
indices = [0, -1]
b = a[indices] # array([0, 26])

对于3d案例:

vertices = [(0,0,0),(0,0,-1),(0,-1,0),(0,-1,-1),(-1,-1,-1),(-1,-1,0),(-1,0,0),(-1,0,-1)]
indices = list(zip(*vertices))  #Can store this for later use.
a = np.arange(27).reshape((3,3,3)) #dummy array for testing.  Can be any shape size :)
vertex_values = a[indices].reshape((2,2,2))

我首先写下所有顶点(虽然我愿意打赌,有一种聪明的方法可以使用itertools来实现它,这可以让你将它扩展到N维......)。指定顶点的顺序是它们在输出数组中的顺序。然后我“转置”顶点列表(使用zip),以便所有x索引在一起,所有y索引在一起等等(这就是numpy喜欢它的方式)。此时,您可以保存该索引数组,并在需要方框的角时使用它来索引数组。您可以轻松地将结果重新整形为2x2x2阵列(尽管我拥有它的顺序可能不是您想要的顺序)。

答案 3 :(得分:3)

根据您提到的(N,N,N) ndarray X的具体情况,以下内容适用于您?

s = slice(0,N,N-1)
X[s,s,s]

实施例

>>> N = 3
>>> X = np.arange(N*N*N).reshape(N,N,N)
>>> s = slice(0,N,N-1)
>>> print X[s,s,s]
[[[ 0  2]
  [ 6  8]]
 [[18 20]
  [24 26]]]

答案 4 :(得分:2)

>>> from operator import itemgetter
>>> first_and_last = itemgetter(0, -1)
>>> first_and_last([1, 2, 3, 4, 5])
(1, 5)

答案 5 :(得分:1)

为什么要使用切片?获取每个元素

result = [s[0], s[-1]]

更好,更具可读性。

如果真的需要使用切片,那么您的解决方案是我能想到的最简单的工作方式。

这也适用于您提到的3D案例。