For Döngüsünün İçinde Listedeki Şeyi Nasıl Silebilirim ?

Yine her bir site için ayiklanmis listesi ekrana bastırılacak. Böylece bir sonraki siteye geçmeden önce yeni listenin nasıl bir hal aldığını görebilirsiniz. Şayet istediğiniz gibi bir sonuç elde ediyorsanız, o print() ifadesini kaldırabilirsiniz.

Hocam Bütün Sorun Halloldu Teşekkür Ederim :slight_smile:

Rica ederim, iyi çalışmalar, iyi seneler.

Merhaba.

Ne kadar uzun bir konu olmuş; bir zaman sonra hızlı hızlı okumaya başladım, sonra da okumayı bıraktım. :smile: @dildeolupbiten, başkalarına yardım konusundaki azmin takdire şayan… :slight_smile:

Sonraki yapılanları pek anlayamadım ama ilk sorunun neyden kaynaklandığını muhtemelen biliyorum. Liste döngülerinde, listeye öğe ekleme ve listeden öğe silme işlemlerinde dikkatli olmalısınız. Çünkü döngü listedeki öğe sayısı üzerinden çalışır ve çalışması sırasında listenin uzunluğunun değişmesi öngörülemeyen hatalara sebep olabilir. Örneğin:

# Listeden öğe siliyoruz.
>>> liste = [1, 2, 3]
>>> for i in liste:
...     liste.remove(i)
...
>>> liste
[2]
# Listeye öğe ekliyoruz.
>>> liste2 = [4, 5, 6]
>>> for i in liste2:
...     liste2.append(i)
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
MemoryError

Gördüğünüz üzere, listeden öğe çıkardığımızda elimizde beklemediğimiz bir sonuç kalıyor. Listeye öğe eklemeye çalıştığımızda ise uçbirim bir süre takıldıktan sonra bir MemoryError hatası alıyoruz. Bunların sebeplerini düşünmedim, düşünen ve bulan olursa bana da haber etsin. :smile:

Buna çare olarak ise listenin bir kopyasını çıkarıp asıl liste üzerinde dönerken kopya listeyi değiştirebilirsiniz.

İyi çalışmalar.

1 Beğeni

Merhaba İsmail kardeş. Programı çalıştırana kadar (gerekli siteler ve şifreleri kullanana kadar) tam olarak ne yapılacağını anlamakta zorlanıyordum. :slight_smile:

For döngülerine giren listelerden eleman silmek, listeyi daraltıyor ve indeks sırası bozuluyor. (Sizin verdiğiniz örnekte, listenin ilk elemanı olan 1 siliniyor. For döngüsü ile listenin 2. elemanına geçiliyor ama artık listenin ilk elemanı 2 olduğu için for döngüsü 2’yi es geçiyor, çünkü ilk elemanla ilgili silme işlemini yapmıştı. 1’i sildikten sonra sıra yeni listenin 2. elemanı olan 3’e geliyor.) Bu yüzden sizin de bahsettiğiniz gibi, -liste üreteci ile üretilmiş- yedek bir liste oluşturup, bu listeyi kullanma fikri mantıklı geldi.

2 Beğeni

aynı sorunu bende daha önce yaşamıştım bunun başka bir çözümü var mı acaba ? merak ettim doğrusu ?

Aslında aşağıdaki gibi bir yöntem de kullanılabilir. Aşağıdaki a ve b örneklerini inceleyebilirsiniz. a listesinin bütün elemanları silinemezken, b listesinin bütün elemanları silinebiliyor.

>>> a = [i for i in range(10)]
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> for i in a:
...     a.remove(i)
... 
>>> a
[1, 3, 5, 7, 9]
>>> 
>>> b = [i for i in range(10)]
>>> b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> while len(b) > 0:  # Silme işlemini tekrar tekrar yapması için.
...     for i in b:
...         b.remove(i)
... 
>>> b
[]
>>> 
1 Beğeni

acaba siraya uygun siliyor mu deneyemedim henuz mesela elimde devasa bir veri var bunlari parca parca dosyadan okuyup listeye aliyorumda isin biten veri silinecek ama belli bir sirayla yani once 1 sonra 2 seklinde 1 den 3 atlamasi isime yaramaz cunku daha yazdigim kodda boyle oluyordu bunun icin liste uzunlugunda bir dongu ayarliyordum ancak dosyadan gelen verinin boyutu devamli ayni olmuyor baya karisti yani anlayacagin neyse halletmistim zatende yinede merak ettim.

Merhaba, yapmak istediğinizi diğer yoldan (liste üreteçleri) yöntemiyle de yapabilirsiniz. Aşağıdaki örneğe göre ayiklanmis isimli listenin öğelerinin zamana bağlı olarak nasıl değiştiğini görebilirsiniz. Sanki ortada bir silme işlemi varmış gibi görünüyor ama burada ayiklanmis listesi, liste üretecinde tanımlanmış ifadelere göre yeniden tanımlanıyor.

>>> import time
>>> 
>>> ayikla = []
>>> liste = [i for i in range(10)]
>>> 
>>> for i in liste:
...     ayiklanmis = [i for i in liste if i not in ayikla]
...     print(ayiklanmis)
...     ayikla.append(i)
...     ayiklanmis = [i for i in liste if i not in ayikla]
...     time.sleep(1)
... 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[2, 3, 4, 5, 6, 7, 8, 9]
[3, 4, 5, 6, 7, 8, 9]
[4, 5, 6, 7, 8, 9]
[5, 6, 7, 8, 9]
[6, 7, 8, 9]
[7, 8, 9]
[8, 9]
[9]
>>> ayiklanmis
[]
>>> 

Veya aşağıdaki yöntemi de kullanabilirsiniz; silme işlemi her zaman ilk eleman üzerinden, listede eleman kalmayıncaya kadar yürütülür.

>>> liste = [i for i in range(10)]
>>> 
>>> while len(liste) > 0:
...     for i in liste:
...         print(liste)
...         liste.remove(liste[0])
... 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[2, 3, 4, 5, 6, 7, 8, 9]
[3, 4, 5, 6, 7, 8, 9]
[4, 5, 6, 7, 8, 9]
[5, 6, 7, 8, 9]
[6, 7, 8, 9]
[7, 8, 9]
[8, 9]
[9]
>>> liste
[]
>>> 
1 Beğeni

Aslında yukarıdaki son örnekte for döngüsünü kullanmaya gerek yok. Sadece while döngüsü de kullanılabilir:

>>> liste = [i for i in range(10)]
>>> while len(liste) > 0:
...     print(liste)
...     liste.remove(liste[0])
... 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[2, 3, 4, 5, 6, 7, 8, 9]
[3, 4, 5, 6, 7, 8, 9]
[4, 5, 6, 7, 8, 9]
[5, 6, 7, 8, 9]
[6, 7, 8, 9]
[7, 8, 9]
[8, 9]
[9]
>>> liste
[]
1 Beğeni