Jump to content

Problēma ar dzēšanu no listes pitonā


Smii
 Share

Recommended Posts

Pildu uzdevumus pitona apmācības kursā un vienā uzdevumā ir kreņķis:

# programmai jaizvac patskani no stringa

text = "Hey look Words!" # strings
vovels = "aeuio" # patskani
text = list(text)
print text
for a in text:
    for b in vovels:
        if a == b:
            del(text[text.index(b)]) # nodzes liste attiecigo patskani
            print "dzesam jo %s sakrit ar %s" % (a, b) # tas debugam
        else:
            print "nedzesam jo %s nesakrit ar %s" % (a, b)
print "".join(text) # teksta pedejais o netiek nodzests. Kadel?

Rezultāts dod Hy lk Words! lai gan vajadzētu būt aizvāktam arī burtam no vārda Words bet jamais nedodās rokās un es nesaprotu, kādēļ...

 

Tie visi daudzie print ir debugam un tajos parāda, ka nosacījumi izpildās. Problēma ir kaut kur iekš funkcijas del, lai gan visam jābūt smuki. Varbūt kaut kur nobrūk indekss? Bet tad viņš bļautu, ka out of range...

Link to comment
Share on other sites

Nedzēs ārā no tā paša elementa, kuram tu ej cauri ciklā.

Labots - wxy
  • Patīk 1
Link to comment
Share on other sites

androidss


text = 'Hello look Words!'

vovels = 'aeuio'

text = [letter for letter in text if letter not in vovels]

text = ''.join(text)

 

Labots - androidss
  • Patīk 1
Link to comment
Share on other sites


text = 'Hello look Words!'

vovels = 'aeuio'

''.join(filter(lambda x: x not in vovels,list(text)))

Link to comment
Share on other sites

marrtins

Pitonu dzēšana šodien ir ļoti aktuāla :)

  • Patīk 1
Link to comment
Share on other sites

vai  ta pitonā datu struktūra nav izmantojama kā f-ja ?   kā iekš clojure ?

(apply str (remove (set "aeuio") "Hello look Words!"))
Link to comment
Share on other sites

Izskatās, ka @@wxy *vienīgais* atbildēja uz autora jautājumu (jebšu deva korektu hintu).

 

Autoram - pamēģini tos printus aizvākt un viņu vietā pielikt "print a" uzreiz zem pirmā "for" - redzēsi, ka "a" nav gluži tas, ko tu domā.

 

Lai izlabotu konkrēto kodu, "for a in text:" būtu jānomaina uz "for a in text[:]:", citiem vārdiem - jāiterē cauri kopijai no "text". Tad kods strādās tā, kā vēlies. Viss pārējais jau ir optimizācijas un valodas iespēju apgūšana un izmantošana - sākot ar "if a in vovels", turpinot ar list comprehensioniem un beidzot ar filter() un lambdām.

Link to comment
Share on other sites

nevertell

Filter jau nu ir rudimentāla funkcija, kuru aizvieto list comprehensions.  Hardkōr pitonisti arī lambdas īsti negrib vairs atbalstīt, jo tās tāpat regulāri tika pielietotas priekš filter() un tāda tipa funkcijām. 

Link to comment
Share on other sites

Filter jau nu ir rudimentāla funkcija, kuru aizvieto list comprehensions.

 

Idiomatic clojure kods būtu ar filter/remove.   Lasāmāks par list comprehension.   

Nezinu kā pareizāk pitonā,  bet tas ir savādi, ja viņiem nepatīk lambdas   un/vai   map/filter/reduce f-jas.

 

PS   List comprehension  ir syntactic  sugar,  kuru parasti aizstāj ar filter / map funkcijām.  Scala kompilators tā dara.

Labots - MarisO
Link to comment
Share on other sites

Man jau šai brīdī būtiski ir atrisināt uzdevumu ar kursā apgūtajiem līdzekļiem :) Bet enīvei paldies par ieteikumiem, tie lieliski noderēs kā reference tālāk. 

 

Pats to uzrakstīju šādi

# programmai jaizvac patskani no stringa

text = "Hey look Words!" # strings
vovels = "aeuio" # patskani
text = list(text)
dellist = []
s = 0
print text
for a in text:
    for b in vovels:
        if a == b:
            dellist.append(s)
    s += 1
for s1 in dellist:
    text[s1] = ""
print "".join(text)

To print text var vākt ārā, piemirsās nodzēst.


def anti_vowel(text):
    for char in text:
        if char in 'AEIOUaeiou':
            text = text.replace(char,'')
    return text

Un te arī atradu īsāku variantu.

Link to comment
Share on other sites

Smii, vēl variants - iet cauri tam masīvam nevis ar "for a in text", bet "while i < len(text)". Ciklā ja i-tais elements ir dzēšams, tad dzēšam, ja ne, tad palielinam i. Tad nevajadzējs ne dellist, ne tukšus stringus.

Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...