Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: Tiedoston rivien järjestäminen

jogi [01.09.2014 02:43:23]

#

Kielenä siis Python

avaa = open("sanoja.txt","r")
lista = [avaa.read()]
lista.sort()
print("Sanat laitettuna aakkosjärjestykseen:")
for i in lista:
	print(i)

Tehtävässä on tiedosto nimeltä "sanoja.txt", joka sisältää SANAT

aavikkorotta
autokauppias
hattuteline
huono
kaljakori
kivitalo
kumipallo
lapio
puuveistos
rautanaula
saunatonttu
tuuli

Kuitenkin väärässä aakkosjärjestyksessä ja tehtävässä nuo tulee saada laitettua aakkosjärjestykseen

ongelmani tässä tehtävässä on siis täysin kuinka saada nuo sanat sortattua.

Ensimmäinen kerta kun tehtäviä tehdessä tuli tilanne, jossa en yksinkertaisesti saa mieleeni mitään asiaa mikä saisi tuon toimimaan oikein.

Saan siis tekstin tuolla koodilla tulostumaan oikein tehtävänannon mukaisesti allekkain jokaisen sanan, mutta aakkosjärjestys on väärä. Ainut pieni asia minkä keksin on se, että mahdollisesti, eli oman oletukseni mukaan

for i in lista
	print(i)

tulostaa suoraan listan mitä avaa.readlines() tulostaisi niin, että lista olisi ainoastaan variable tuon kutsumiselle. Haluaisiko joku auttaa ja kertoa missä on vika, koska minulla ei ole mitään ideaa?


.sort() Laittaa alkiolistan järjestykseen arvojen mukaisesti. Järjestys määräytyy merkkien ASCII-arvon mukaisest

on ainut mitä mainitaan koko asiasta koko minun kurssimateriaalissani joten oletan, että ongelma jossain muualla kuin siinä.

Kiitos avusta jo etukäteen

Antti Laaksonen [01.09.2014 04:25:36]

#

Ongelmana on, että

lista = [avaa.read()]

muodostaa listan, jossa on yhtenä merkkijonona koko tiedoston sisältö (eli tässä tapauksessa kaikki sanat rivinvaihdoin erotettuina). Koska listalla on vain yksi merkkijono, sen järjestämisellä ei ole vaikutusta.

Ratkaisu on kirjoittaa tämän sijasta esim.

lista = avaa.readlines()

jolloin listalle tulee jokainen tiedoston rivi omana merkkijonona.

Ehkä parempi tapa on

lista = [x.strip() for x in avaa.readlines()]

joka tekee muuten saman kuin äskeinen koodi, mutta poistaa samalla jokaisen rivin lopusta rivinvaihdon.

jogi [01.09.2014 07:51:48]

#

Miten/miksi rivinvaihtomerkin poistaminen vaikuttaa .sort-toimintoon?

En saanut millään toimimaan tuota. Ei tulostanut mitään, ainoastaan sanan "lapio\n" jos käytin .readline() tai jos käytin .readlines() kaikki sanat muodossa x\n ilman rivivaihtoja.

Olen oppinut parhaiten näkemällä toimivan koodin, koska siitä nään mikä toiminto tai koodin osa tekee mitäkin joten jos olisi mahdollista voisitko postata täydellisen koodin miten itse tekisit sen? Ongelma tässä itseopiskelukurssissa on se, että ei ole ketään keneltä kysyä "virallisesti" apua jos kohtaan tehtävissä ongelman vaan pitää jäädä junnaamaan samaa tehtävää moneksi moneksi tunniksi, koska en voi hypätä seuraavaan tehtävään.

Grez [01.09.2014 09:45:26]

#

jogi kirjoitti:

Miten/miksi rivinvaihtomerkin poistaminen vaikuttaa .sort-toimintoon?

Ei se (olennaisesti) vaikutakaan. Lähinnä tulostukseen, että tuleeko sieltä sitten "lapio" vai "lapio\n"

Ja eikös tuossa nyt käytännössä annettu toimiva koodi, jos omasta koodistasi piti peräti yhtä riviä muuttaa ja Antti kertoi mikä se voisi olla. Ainakin itsellä toimii niin kuin pitääkin:

avaa = open("sanoja.txt","r")
lista = [x.strip() for x in avaa.readlines()]
lista.sort()
print("Sanat laitettuna aakkosjärjestykseen:")
for i in lista:
  print(i)

jogi [01.09.2014 10:25:33]

#

Grez kirjoitti:

jogi kirjoitti:

Miten/miksi rivinvaihtomerkin poistaminen vaikuttaa .sort-toimintoon?

Ei se (olennaisesti) vaikutakaan. Lähinnä tulostukseen, että tuleeko sieltä sitten "lapio" vai "lapio\n"

Ja eikös tuossa nyt käytännössä annettu toimiva koodi, jos omasta koodistasi piti peräti yhtä riviä muuttaa ja Antti kertoi mikä se voisi olla. Ainakin itsellä toimii niin kuin pitääkin:

avaa = open("sanoja.txt","r")
lista = [x.strip() for x in avaa.readlines()]
lista.sort()
print("Sanat laitettuna aakkosjärjestykseen:")
for i in lista:
  print(i)

Minun moka. Luulin, että nuo "X" osat vaativat, että lisään jonkun variablen tilalle.

Mitä nuo osat "X" edes tekevät tuossa koodissa? Strip on komento mitä koko kurssimateriaalissa ei edes opeteta niin sen käyttäminen on myös siitä syystä hyvin haparoivaa.

Kiitos molemmille avusta. Voi olla, että tulen kohta kysymään miten toimin kun pitää tallentaa tiedostoon bittiarvoina ja avata se myöhemmin ja ottaa tiedot sisältä ihan perus merkkeinä.

-tossu- [02.09.2014 00:08:55]

#

Antin koodissa x on muuttuja aivan kuten i omassasi. Veikkaan, että koodissa näytti oudolta siinä käytetty list comprehension -rakenne. Listan voisi luoda myös tavallisella for-silmukalla.

lista = []
for rivi in avaa.readlines():
	sana = rivi.strip()
	lista.append(sana)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta