Bir listenin son öğesi hariç tümü arasında nasıl geçiş yapılır?


160

Her öğeyi takip edene karşı kontrol eden bir liste boyunca döngü yapmak istiyorum.

Y içinde x için kullanarak son öğe dışında tüm öğeleri döngü olabilir bir yolu var mı? Mümkünse dizinleri kullanmadan yapmayı tercih ederim.

Not

freespace asıl sorumu yanıtladı, bu yüzden cevabı kabul ettim, ama SilentGhost sormam gereken soruyu yanıtladı.

Karışıklık için özür dileriz.

Yanıtlar:


316
for x in y[:-1]

Eğer ybir jeneratör ve ardından yukarıdaki irade değil iştir.


Bu sorumu cevaplıyor, teşekkürler, ama öğeyi x'ten sonra nasıl alacağımı sormayı unuttum. Mümkün mü?
David Sykes

3
- 1 Bunun soruyu cevapladığını sanmıyorum. Her öğeyi bir sonrakiyle karşılaştırmıyor. - odwl 0 saniye önce
odwl

4
Galiba yaptım. Yazar X yapmak istediğini söyledi, sonra Y'yi nasıl yapabileceğini sordu. Y'yi nasıl yapabileceğini cevapladım. Cevabımı kabul etmesi, gerçekten sormak istediği soru olmasa da sorduğu soruyu cevapladığımı gösteriyor . Asker bu cevabı reddedebilir.
freespace

7
OP'nin ilkinde başka bir soru sorması gerektiği için, sorusunun ve bu cevabın başkaları için çok yararlı olmadığı anlamına gelmez. +1
Prof. Falken

1
Bunun jeneratörler için işe yaramadığını belirtiyorsunuz. yJeneratör olduğunda alternatif nedir ?
Joost

50

sekans öğesini aşağıdakilerle karşılaştırmanın en kolay yolu:

for i, j in zip(a, a[1:]):
     # compare i (the current) to j (the following)

15
Bu soruyu sormamı isterdim. Teşekkürler
David Sykes

3
Aslında, ilk dilimi atlayabilirsiniz, çünkü zip uzun listeyi daha kısa olanın uzunluğuna indirir. Bu size bir liste oluşturmayı kaydedecektir. (Büyük listelerle uğraşıyorsanız. Ama bu durumda, hiçbir şey kopyalamayan Ants Aasma'nın yaklaşımını izlemelisiniz.)
bayer

19

Dizi çiftindeki tüm öğeleri akıllıca elde etmek istiyorsanız, bu yaklaşımı kullanın (çift yönlü işlev itertools modülündeki örneklerden alınmıştır).

from itertools import tee, izip, chain

def pairwise(seq):
    a,b = tee(seq)
    b.next()
    return izip(a,b)

for current_item, next_item in pairwise(y):
    if compare(current_item, next_item):
        # do what you have to do

Son değeri özel bir değerle karşılaştırmanız gerekiyorsa, bu değeri sonuna kadar zincirleyin

for current, next_item in pairwise(chain(y, [None])):

değişken isimlendirilmiş gölgeler için bir sonrakinin yerleşik olduğunu lütfen unutmayın
SilentGhost

1
Ben şahsen değişkenin kapsamı küçük ve adı okunabilirlik için iyi olduğunda daha az kullanılan yerleşik gölgeleme sakıncası yok. Bununla birlikte, iyi kodlama uygulamalarını sürdürmek için değişken adlarını düzenledi.
Karıncalar Aasma

5

n'inci öğeyi listedeki n + 1'inci öğeyle karşılaştırmak istiyorsan

>>> for i in range(len(list[:-1])):
...     print list[i]>list[i+1]

orada sabit kodlama olmadığını unutmayın. Aksi hissetmedikçe bu tamam olmalıdır.


3
Bir liste kopyasını önlemek için len (list [: - 1]) öğesini len (list) - 1 ile değiştirebilirsiniz. Ve list adlı bir değişkeni kullanmaktan kaçının ...
Remy Blank

2

Bir listeyi somutlaştırmadan her öğeyi yineleyicide bir sonraki öğeyle karşılaştırmak için:

import itertools
it = (x for x in range(10))
data1, data2 = itertools.tee(it)
data2.next()
for a, b in itertools.izip(data1, data2):
  print a, b

2
Ants Aasma tarafından önerilen tam olarak budur stackoverflow.com/questions/914715/…
SilentGhost

1

Bu, OP'nin sorması gerekenleri cevaplar , yani herhangi bir grup ( n-gram ) için genelleştirilmiş, ardışık elemanları (mükemmel SilentGhost yanıtı) karşılaştıran bir listeyi izleyin : 2, 3, ... :n

zip(*(l[start:] for start in range(0, n)))

Örnekler:

l = range(0, 4)  # [0, 1, 2, 3]

list(zip(*(l[start:] for start in range(0, 2)))) # == [(0, 1), (1, 2), (2, 3)]
list(zip(*(l[start:] for start in range(0, 3)))) # == [(0, 1, 2), (1, 2, 3)]
list(zip(*(l[start:] for start in range(0, 4)))) # == [(0, 1, 2, 3)]
list(zip(*(l[start:] for start in range(0, 5)))) # == []

açıklamalar:

  • l[start:] dizinden başlayarak bir liste / jeneratör oluşturur start
  • *listveya *generator: tüm öğeleri zipyazılmış gibi çevreleme işlevine geçirirzip(elem1, elem2, ...)

Not:

AFAIK, bu kod olabildiğince tembel. Test edilmedi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.