it-swarm.com.de

Python erstes und letztes Element aus dem Array

Ich versuche, das erste und letzte Element dynamisch aus einem Array zu erhalten. 

Nehmen wir an, das Array hat 6 Elemente. 

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

Wenn ich versuche, den first and last = 1,8, 23,7 und 4,6 zu erhalten. Gibt es eine Möglichkeit, Elemente in dieser Reihenfolge zu erhalten? Ich habe mir ein paar Fragen angeschaut LinkLink2 . Ich habe mir diese Links zu Nutze gemacht und mir diesen Prototyp ausgedacht.

#!/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]]]

Dieser Prototyp kann jedoch nicht skaliert werden, wenn Sie mehr als 6 Elemente haben. Ich habe mich gefragt, ob es einen Weg gibt, das Elementpaar dynamisch zu erhalten.

Vielen Dank!

27
pistal

Wie wäre es mit:

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

Je nach Größe von arr kann das Schreiben der gesamten Sache in NumPy performanter sein:

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
22
NPE

Ich endete hier, weil ich für "Python als erstes und letztes Element von Array" gegoogelt habe und alles andere als das gefunden habe. Hier ist die Antwort auf die Titelfrage:

a = [1,2,3]
a[0] # first element (returns 1)
a[-1] # last element (returns 3)
96
lenooh

Verwenden der fantastischen Indexierung von 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 kopiert das Array, aber alle anderen Operationen sind Zeigertricks mit konstanter Zeit (einschließlich Umkehrung) und daher sehr schnell.

3
Fred Foo
>>> 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)

Andere Option

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

Wie wäre es damit?

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

Der (len(test1)+1)//2 stellt sicher, dass auch das mittlere Element von Arrays ungerader Länge zurückgegeben wird:

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

Wenn Sie nur len(test1)//2 verwenden, werden die mittleren Elemente von Arrays ungerader Länge gelöscht.

1
isedev

Das macht es. Beachten Sie, dass bei einer ungeraden Anzahl von Elementen das Element in der Mitte nicht berücksichtigt wird.

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

Ausgabe:

(1, 5)
(23, 8)
(4, 7)
0
ford