48

配列から最初と最後の要素を動的に取得しようとしています。

したがって、配列に 6 つの要素があるとします。

test = [1,23,4,6,7,8]

first and last = 1,823,7およびを取得しようとしている場合4,6。この順序で要素を取得する方法はありますか? いくつかの質問Link Link2を見ました。私はこれらのリンクの助けを借りて、このプロトタイプを思いつきました..

#!/usr/bin/env python

import numpy

test = [1,23,4,6,7,8]
test1 = numpy.array([1,23,4,6,7,8])
len_test = len(test)
first_list = [0,1,2]
len_first = len(first_list)
second_list = [-1,-2,-3]
len_second = len(second_list)

for a in range(len_first):
        print numpy.array(test)[[first_list[a] , second_list[a]]]
        print test1[[first_list[a], second_list[a]]]

ただし、要素が 6 つを超える場合、このプロトタイプは拡張できません。それで、要素のペアを動的に取得する方法があるかどうか疑問に思っていました。

ありがとう!

4

9 に答える 9

158

「python配列の最初と最後の要素」をグーグルで検索し、これ以外のすべてを見つけたので、ここで終了しました。では、タイトルの質問に対する答えは次のとおりです。

a = [1,2,3]
a[0] # first element (returns 1)
a[-1] # last element (returns 3)
于 2014-01-16T17:46:15.907 に答える
27

どうですか:

In [10]: arr = numpy.array([1,23,4,6,7,8])

In [11]: [(arr[i], arr[-i-1]) for i in range(len(arr) // 2)]
Out[11]: [(1, 8), (23, 7), (4, 6)]

のサイズによってはarr、全体を NumPy で記述した方がパフォーマンスが向上する場合があります。

In [41]: arr = numpy.array([1,23,4,6,7,8]*100)

In [42]: %timeit [(arr[i], arr[-i-1]) for i in range(len(arr) // 2)]
10000 loops, best of 3: 167 us per loop

In [43]: %timeit numpy.vstack((arr, arr[::-1]))[:,:len(arr)//2]
100000 loops, best of 3: 16.4 us per loop
于 2013-01-30T17:14:07.020 に答える
5

Numpy のファンシー インデックスを使用する:

>>> test
array([ 1, 23,  4,  6,  7,  8])

>>> test[::-1]  # test, reversed
array([ 8,  7,  6,  4, 23,  1])

>>> numpy.vstack([test, test[::-1]])  # stack test and its reverse
array([[ 1, 23,  4,  6,  7,  8],
       [ 8,  7,  6,  4, 23,  1]])

>>> # transpose, then take the first half;
>>> # +1 to cater to odd-length arrays
>>> numpy.vstack([test, test[::-1]]).T[:(len(test) + 1) // 2]
array([[ 1,  8],
       [23,  7],
       [ 4,  6]])

vstack配列をコピーしますが、他のすべての操作は一定時間のポインタートリック (反転を含む) であるため、非常に高速です。

于 2013-01-30T17:22:55.067 に答える
5
arr = np.array([1,2,3,4])
arr[-1] # last element
于 2020-03-07T08:27:01.220 に答える
3
>>> test = [1,23,4,6,7,8]
>>> from itertools import izip_longest
>>> for e in izip_longest(test, reversed(test)):
    print e


(1, 8)
(23, 7)
(4, 6)
(6, 4)
(7, 23)
(8, 1)

別のオプション

>>> test = [1,23,4,6,7,8]
>>> start, end = iter(test), reversed(test)
>>> try:
    while True:
        print map(next, [start, end])
except StopIteration:
    pass

[1, 8]
[23, 7]
[4, 6]
[6, 4]
[7, 23]
[8, 1]
于 2013-01-30T17:13:55.160 に答える
1

これはどう?

>>> import numpy
>>> test1 = numpy.array([1,23,4,6,7,8])
>>> forward = iter(test1)
>>> backward = reversed(test1)
>>> for a in range((len(test1)+1)//2):
...     print forward.next(), backward.next()
... 
1 8
23 7
4 6

これ(len(test1)+1)//2により、長さが奇数の配列の中央の要素も確実に返されます。

>>> test1 = numpy.array([1,23,4,9,6,7,8]) # additional element '9' in the middle
>>> forward = iter(test1)                                                      
>>> backward = reversed(test1)
>>> for a in range((len(test1)+1)//2):
...     print forward.next(), backward.next()
1 8
23 7
4 6
9 9

just を使用するlen(test1)//2と、長さが奇数の配列の中間要素が削除されます。

于 2013-01-30T17:14:36.490 に答える
0

これでできます。要素の数が奇数の場合、真ん中の要素は含まれないことに注意してください。

test = [1, 23, 4, 6, 7, 8, 5]    
for i in range(len(test)/2):
    print (test[i], test[-1-i])

出力:

(1, 5)
(23, 8)
(4, 7)
于 2013-01-30T17:20:08.470 に答える
-1

リストに偶数の要素があると仮定すると、次のことができます。

test = [1,23,4,6,7,8]
test_rest = reversed(test[:len(test)/2])

for n in len(test_rest):
    print [test[n], test_test[n]]
于 2013-01-30T17:16:04.723 に答える