Iterasyon ile alakalı soru

neden bir liste içerisinden bir eleman çıkarırken böyle oluyor

l=[1,2,2,5]
for i in l:
    if i == 2:
        l.pop(i)
#print(l) ---> [1,2,5]

lütfen söyleyin merak içindeyim

Temel nedeni listeyi gezerken listeyi modifiye etmeniz. pop metodunun aldığı parametrenin de index olduğunu hatırlatayım; kodunuzu şuraya yapıştırıp Visualize Execution derseniz olayı anlarsınız diye düşünüyorum:
http://pythontutor.com/visualize.html#mode=edit

2 Beğeni

anladım yani listeyi modifiye ettiğimizden listenin indeksleri değişiyor => yani diğer ikinin sırası 3 iken şimdi 2
mesela l=[1,2,2,5]# bir sonraki 2 nin indeksi 2
ama pop metodu çağrıldıktan sonra indeksi 1 oluyor öyle mi yoksa yanlış mı anladım?

sanırım yanlış anladım daha detaylı anlatabilir misiniz? zorunlu değilsiniz tabi ki!!

anladım ama doğrumu anlamışım sormak isterim?

pop edilen index 2, yani listenin içindeki son 2 siliniyor, 5 de bir öne geliyor.

1 Beğeni

sanırım @Emerald_Gamer diyor ki neden diğer 2 yi de for döngüsü devam ederken i değişkeni ile görmezden geliyor ve atmıyor. Sanırım bunu soruyor. Sormuyor olsa da ben merak ettim for döngüsü neden sadece 1 tane 2 yi görüyor ve onun indeksini alıp atıyor. For döngüsüne devam edip diğer 2 yi gördükten sonra pop içerisine tekrar 2 yi alıp listedeki 5 elemanını atması gerekmiyor muydu?

1 Beğeni

sanırım pop sadece 0,1,2 gibi indeksler ile çalışıyor ondan

1 Beğeni

yok reis öyle değil. uzun bir listenin içerisine gönder uzak bir indeksi onu da çalıştırır

mesela eğer str bir ifadeyi çıkartmaya çalışırsanız
TypeError: 'str' object cannot be interpreted as an integer
alırsın

1 Beğeni

hahahaha zaten gibi demiştim ya :smile:

1 Beğeni
l = ["araba","tevhid","cbr600rr","suzuki"]
l.pop(3)
print(l)

pop içerisine gönderdiğin değer str olursa çalıştırmaz daima int değer almalı çünkü

demişti

1 Beğeni

bende anlamak için söyledim zaten sağol :slightly_smiling_face:

1 Beğeni

bu arada eğer kodu şu şekil yaparsan çalışıyor konuştuğumuz mantık

l=[1,2,2,5]
yy = 0
for i in l:
        if i == 2:
            xx = l.count(2)
            while True:
                if yy == xx:
                    break
                else:
                    yy += 1
                    l.pop(i)

print(l)

yy değeri liste içerisinde yer alan 2 nin kaç kere geçtiğinin int karşılığına eşit olana kadar i değerindeki index’i atmaya devam ediyor <3

İlk 2’ye (index 1’e) gelindiğinde ikinci 2 (index 2) silinmiş oluyor, listenin içinde olmayan bir elemanı for döngüsü nasıl görsün?

1 Beğeni

Şöyle düşünülebilir belki:

Farz edin ki for döngüsü başladığında, python dahili bir counter tutuyor kenarda. Bu counter döngünün içerisinde ne olursa olsun*, sona gelindiğinde** bir artıyor ve döngü dönmeye devam ediyor ta ki StopIteration yükselene kadar. Bu counter’a Z diyelim ve asıl soru üzerinden gidelim:

=
İlk dönüşte liste = [1, 2, 2, 5] ve Z = 0;
i'ye de dolayısıyla liste[Z] = liste[0] = 1 değeri atanıyor.

if kontrol ediliyor, 1 != 2, içeri girmeden bu dönüş bitiyor.

=
İkinci dönüşte liste = [1, 2, 2, 5] ve Z = 1;
i'ye de dolayısıyla liste[Z] = liste[1] = 2 değeri atanıyor.

if kontrol ediliyor, 2 == 2, içeri giriliyor.

liste.pop(2) gerçekleniyor ve 2.indisteki eleman listeden atılıyor.

=
Üçüncü dönüşte liste = [1, 2, 5] ve Z = 2;
i'ye de dolayısıyla liste[Z] = liste[2] = 5 değeri atanıyor.

if kontrol ediliyor, 5 != 2, içeri girmeden bu dönüş bitiyor.

=
Dördüncü dönüşte liste, next isteğine StopIteration yükseltiyor ve döngü duruyor.

*: break ve return'ü göz ardı edebiliriz onlar zaten döngüyü bitirmeye yönelik hareketler
**: veya continue ile karşılaşılırsa

1 Beğeni
liste = [71, 72, 73, 74, 75]

for num in liste:
    if num == 73:
        liste.remove(73)
    print(num)

Bunun nasıl bir sonuç vereceğini tahmin ederek olayı anlayıp anlamadığınızı görebilirsiniz belki.

1 Beğeni

anladım aslında doğru anlamışım modifiye ettiği için liste değişiyor bu yüzden öyle oluyor

mesela böyle yaptığımda oluyor:

liste = [1, 3,3,5]
liste2=liste.copy()

for num in liste:
    if num == 3:
        liste2.remove(3)
print(liste2)
1 Beğeni

anladım saol…