Çö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. itertoolsmodü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
chainiki diziyi bir diziye bağlar; tek unsur sırası eklemek için kullanılan [None]içinprevs
isliceilki dışındaki tüm öğelerin bir sırasını oluşturmak chainiç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
izipolarak 3 diziyi bir üçlü diziye dönüştürmek için kullanılır.
Not izipherhangi bir giriş sekansı bitkin aldığında son elemanı bu yüzden, durur prevsson öğe onun olacağını böyle öğe bulunsa - doğrudur göz ardı edilecektir, prev. Son öğeleri çıkarmaya çalışabiliriz, prevsancak izipdavranışları bu gereksiz
Ayrıca unutmayın tee, izip, isliceve chaingelen itertoolsmodü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, zipyerine kullanabilirsiniz izip. İthalat gerek yok zip, bu önceden tanımlanmıştır python 3- kaynağını