2015-05-21 13 views
8

Bu kod biçiminde önceki veya sonraki nesnelere nasıl erişilir?Len olmadan önceki nesneyi al (liste)

alignment = [[a,b,c],[2,3,4],[q,w,e]] 

for index,obj in enumerate(alignment): 
    alignment[index-1] # pre 
    alignment[index+1] # next 

Not o next öğelere erişmek için daha etkin bir yol olarak ve çöp:

for i in range(0,len(alignment)): 
    alignment[i-1][objIndex] 

cevap

12

Sen enumerate kullanabilirsiniz:

alignment = [[a,b,c],[2,3,4],[q,w,e]] 

for obj in alignment: 
    some code here to get previous object 

Birlikte bunu nasıl biliyor Çoklu indekslemeden, sizden bir yineleme nesnesi oluşturmak için iter() işlevini kullanabilirsiniz. next ile ve her tekrarında sonraki elemanlarına erişimi (ikinci ucuna öğeden) r listesi: next() işleve ikinci argüman olarak None geçemiyor eğer bir zam olacağını

>>> l=[1,2,3,4] 
>>> it=iter(l[1:]) 
>>> for i in l : 
... print i,next(it,None) 
... 
1 2 
2 3 
3 4 
4 None 

NotStopIteration error.You bir try-except bildirimi ile de işleyebilirsiniz.

>>> for i,j in zip(l,l[1:]): 
... print i,j 
... 
1 2 
2 3 
3 4 

zip(l,l[1:]) size aşağıdaki öğe çiftleri verecektir: (python 3'de zip) Eğer zip işlevini kullanabilirsiniz kısa listeler için de

ve uzun listeleri itertools.izip() function için

[(1, 2), (2, 3), (3, 4)] 

ve Döngünün içinde i geçerli öğe olarak j sonraki öğe olacak veya j geçerliolarak kullanabilirsiniz ! 563.210 :) önceki olacaktır

+0

Bu, son öğenin ilk önce olması ve sondan sonra bir sonraki öğeyi bulamadığında bir hataya neden olacağını dikkate alır. –

+0

@YannVernier Nitekim ve neden 'Yok' ile 'sonraki' işlevinden geçiyor. – Kasramvd

+1

Neden * kısa listeler için *? Tüm durumlarda zip() 'çözümü en iyi seçenektir. Eğer 2.x iseniz, zip() 'tembel değildir,' itertools.izip() 'kullanarak çözümdür. –

0
for index, obj in enumerate(alignment): 
    alignment[index-1] 

döngü indeksi elde ve önceki nesne tarafından erişilebilir nesne olacaktır (bu indeks - 1) (bu indeks + 1)

1
sonraki ise

Komşu girişi için kullanımınıza bağlı olarak birçok farklı seçenek vardır. Eğer bir referans olarak önceden girişi tutmak gerekiyorsa

for left,right in zip(somelist[:-1], somelist[1:]): 
    pass 

Veya: Örneğin, yalnızca değiştirmek liste çiftleri işlemek istiyorum ve burada

prev = None 
for item in somelist: 
    pass 
    prev = item 

None yerde kullanılır Kasra iter() temelli örnekte sondan sonraki bir sonraki öğe için nasıl kullanıldığına benzer şekilde, bir önceki öğenin önceki bölümünün.

+0

Sadece bu soruyu gördüm, ve bu başıma açılan ilk yöntemdi ... –

İlgili konular