Çözümler şimdiye kadar sadece listelerle ilgileniyor ve çoğu listeyi kopyalıyor. Benim deneyimlerime göre bu pek çok kez mümkün değil.
Ayrıca, listede tekrarlanan öğelere sahip olabileceğiniz gerçeğiyle ilgilenmezler.
Sorunuzun başlığında " Bir döngü içindeki önceki ve sonraki değerler , ancak burada çoğu yanıtı bir döngü içinde çalıştırırsanız, bulmak için her öğede tüm listeyi tekrar yinelersiniz.
Bu yüzden yeni bir fonksiyon yarattım. itertools
modülü kullanarak yinelenebilir olanı böler ve dilimler ve önceki ve sonraki öğelerle birlikte tuples oluşturur. Kodunuzun yaptığı tam olarak bu değil, ancak bir göz atmaya değer çünkü muhtemelen sorununuzu çözebilir.
from itertools import tee, islice, chain, izip
def previous_and_next(some_iterable):
prevs, items, nexts = tee(some_iterable, 3)
prevs = chain([None], prevs)
nexts = chain(islice(nexts, 1, None), [None])
return izip(prevs, items, nexts)
Sonra bir döngüde kullanın ve içinde önceki ve sonraki öğelere sahip olacaksınız:
mylist = ['banana', 'orange', 'apple', 'kiwi', 'tomato']
for previous, item, nxt in previous_and_next(mylist):
print "Item is now", item, "next is", nxt, "previous is", previous
Sonuçlar:
Item is now banana next is orange previous is None
Item is now orange next is apple previous is banana
Item is now apple next is kiwi previous is orange
Item is now kiwi next is tomato previous is apple
Item is now tomato next is None previous is kiwi
Herhangi bir boyut listesiyle (çünkü listeyi kopyalamadığı için) ve herhangi bir yinelenebilir (dosyalar, kümeler, vb.) İle çalışacaktır. Bu şekilde, sırayı yineleyebilir ve önceki ve sonraki öğelerin döngü içinde kullanılabilir olmasını sağlayabilirsiniz. Sıradaki öğeyi tekrar aramaya gerek yoktur.
Kodun kısa bir açıklaması:
tee
giriş dizisi üzerinde 3 bağımsız yineleyici verimli bir şekilde oluşturmak için kullanılır
chain
iki diziyi bir diziye bağlar; tek unsur sırası eklemek için kullanılan [None]
içinprevs
islice
ilki dışındaki tüm öğelerin bir sırasını oluşturmak chain
için kullanılır , daha sonra birNone
sonuna kadar
- Şimdi buna benzer 3 bağımsız sekans var
some_iterable
:
prevs
: None, A, B, C, D, E
items
: A, B, C, D, E
nexts
: B, C, D, E, None
- son
izip
olarak 3 diziyi bir üçlü diziye dönüştürmek için kullanılır.
Not izip
herhangi bir giriş sekansı bitkin aldığında son elemanı bu yüzden, durur prevs
son öğe onun olacağını böyle öğe bulunsa - doğrudur göz ardı edilecektir, prev
. Son öğeleri çıkarmaya çalışabiliriz, prevs
ancak izip
davranışları bu gereksiz
Ayrıca unutmayın tee
, izip
, islice
ve chain
gelen itertools
modül; Girdi dizileri üzerinde anında (tembel olarak) çalışırlar, bu da onları verimli kılar ve tüm dizinin herhangi bir zamanda bir kerede bellekte olması gerekliliğini doğurmaz.
İçinde python 3
, içe aktarırken bir hata gösterecek izip
, zip
yerine kullanabilirsiniz izip
. İthalat gerek yok zip
, bu önceden tanımlanmıştır python 3
- kaynağını