2010-12-15 23 views
6

Yani, array[:-1] numaralı çağrıların diziyi kopyalayacağını görüyorum.Python döngüsüne [: -1]

İçinde 3000 gibi eleman içeren geniş bir dizim var. Üzerinde yinelediğim gibi klonlanmak istemiyorum! Sadece sonuncuya kadar tekrarlamak istiyorum.

for item in array[ :-1 ] : 
    # do something with the item 

Yani, bir karşı değişken başvurmak zorunda

for c in range(0, len(array) - 1) : 
    # do something with array[ c ] 

yapmak veya yapmaya yolu yoktur/array[:-1] sözdizimi verimli olacak?

+1

olası yinelenen [I Python listesinde bir "görüntüleme" oluşturabilir miyim?] (http://stackoverflow.com/questions/3485475/can-i-create-a-view-on-a-python-list) –

+2

Ne yazık ki, "diğer soru" tamamen "itertools" üzerinde özlüyor. Böylece ben bu soruyu kapatmak için oy kullanmıyorum *. –

+0

@pst, "doğru olanı yapmaz" diğer soruyla ilgili daha iyi bir cevap vermek mi? –

cevap

6
for item in itertools.islice(array, len(array) - 1): 
4

Kontrol dışarı itertools.islice istediğinizi yapacak gibi görünüyor:

from itertools import islice 
for item in islice(array, 0, len(array) - 1): 
    # do something with item 

Bu hakkındadır İstediğinizin yarısı; array[i] deme gereğini ortadan kaldırır ancak len(array) - 1 belirtme gereği duymaz.

Değerli olan şey için, 3000 ürün modern bir bilgisayar için bir şey değildir, programınız yavaş bir şekilde yavaş olmadıkça ve bu kod parçasının katkıda bulunan bir faktör olduğunu belirlemek için profil oluşturmazsanız verimsizliğe endişelenmem. Eğer istemediğiniz zaman için

2

// dizinin uzunluğunu bilmiyorum olamaz:

def allbutlast(seq): 
    it = iter(seq) 
    el = next(it) 
    for e in it: 
    yield el 
    el = e 

for i in allbutlast([1, 2, 3]): 
    print i 
ait
İlgili konular