• Register

Brisanje elementov iz seznama [closed]

+7 votes
677 views

S kolegom sem naletel na težavo pri brisanju elementov iz seznama.

in sicer:
 

Če imamo seznam števil in bi radi izbrisali samo števila z večjo vrednostjo od določene, to program naredi po delčkih oziroma ne izbriše vseh.

primer:

 
seznam = list(range(300, 351)
 

for i in seznam:

    if i > 325:

        seznam.remove(i)

 

enako tudi za podoben ukaz

for i in seznam:

    if i > 325:

        seznam.pop(seznam.index(i))

  

Vedno izbriše samo vsaki drugi element, ki temu ustreza. S ponavljanjem for stavka izbriše vse. Če namesto brisanja elementov zapišemo:

 

for i in seznam:

    if i > 325:

        print(i)
 

pa nam zazana oz printa vse elemente, ki temu ustrezajo.

Zanima me zakaj pride do te anomalije in kakšna je druga mogoče boljša verzija tega, brez da bi naredili nov seznam. Gre za povsem splošen primer, ki sva ga opazila.

closed with the note: Duplikat vprašanja: http://pinm.ladisk.si/1195/odstranitev-%C5%A1tevil-ve%C4%8Djih-od-dolo%C4%8Dene-vrednosti
asked Oct 10, 2016 by tilen.mlinaric (7,770 points)
closed Oct 13, 2016 by blaz

3 Answers

+3 votes

Ko znotraj zanke odstranite element iz seznama, se za 1 zniža indeks vseh nadaljnih elementov v seznamu. V naslednjem koraku zanke zato en element "preskočite".

Zelo podobno vprašanje je sicer že objavljeno, poskuite s kako od tam predlaganih rešitev.

answered Oct 10, 2016 by dgorjup (74,760 points)
Nekako razumem kaj želite povedati, vendar sama logika če gre funkcija:
for x in seznam:

po vsakem elementu bi moralo pogledati vsak element in ne preskakovati, verjetno je problem v tem, ker si program zapiše index elementa, ki ga je gledal in ko ga izbrišeš je element za njim enakega indexa (ki ga pa naj bi program že pregledal) in zato enega preskoči. Imam prav?
Sem opazil, da ste ravno odgovorili mojo hipotezo pri drugem podobnem vprašanju. Hvala
+2 votes
Jaz sem takole rešil vajino težavo:

najprej sem vtipkal:

seznam = list(range(300, 351))
seznam  

(in mi izpiše ta seznam..)

nato pa sem za izločitev vrednosti večjih od 325 uporabil naslednjo kodo:

seznam = [i for i in seznam if i < 325]
seznam

(in mi je izpisalo številke od 300 do 324)

Ni zbrisal vsakega drugega elementa ampak vse, ki niso ustrezali pogoju --> v vajinem primeru številke večje od 325.
answered Oct 10, 2016 by markrmr (240 points)
Naj te opozorim da nisi izbrisal, ampak si naredil nov seznam, kar pa tukaj ni cilj
+3 votes
V enem komentarju sem videl da moraš narediti: for i in seznam.copy():

                                                                              if i>(številka k želiš):

                                                                                    seznam.remove(i)

Pa naj ne bi preskakoval členov. :)
answered Oct 13, 2016 by Miha5 (8,480 points)
Ja, to pa deluje, kar je zelo zanimivo!
...