These are chat archives for dbwebb-se/python

6th
Nov 2017
limy17
@limy17
Nov 06 2017 12:05
Hej! Håller på med en komplettering för kmom04. Hur får jag min if-sats att söka efter variabeln "info3" i en lista/fil?
Just nu säger programmet att till exempel apa inte finns i filen, fast den gör det?
def backpack3(info3):
    """ Marvin handles inv drop. """
    res3 = backpack1()
    with open("inv.data", "r") as filehandler:
        filehandler.readlines()
        if info3 in res3:
            filehandler.pop(info3)
            print("Marvin släppte: " + str(info3))
        else:
            print("Finns inte i ryggsäcken")
AndreasArne
@AndreasArne
Nov 06 2017 12:08
@limy17 vad har info3 för värde och vad innehåller listan?
limy17
@limy17
Nov 06 2017 12:10
info3 innehåller det som användaren vill slänga, ex inv drop apa, så är info3 = apa.
Listan innehåller allt som användaren lagt i via inv drop x.
AndreasArne
@AndreasArne
Nov 06 2017 12:11
kan du göra print på båda variablerna precis innan du gör kollen och skriva vad du får för output?
limy17
@limy17
Nov 06 2017 12:15
Denna print: print(str(info3) + str(res3))
... ger detta i terminalen:
ost['ormkokoormroskossakol hummer häst gås gås flower får Fido orm apa ost ']
AndreasArne
@AndreasArne
Nov 06 2017 12:16
och då förväntar du dig att "ost" ska finnas som ett värde i din lista?
limy17
@limy17
Nov 06 2017 12:16
Ja
Men hur får jag if-satsen att hitta det, då inte "if info3 in list" fungerar rakt av?
AndreasArne
@AndreasArne
Nov 06 2017 12:18
din lista innehåller ett värde, som är en sträng ormkokoormroskossakol hummer häst gås gås flower får Fido orm apa ost. När du kollar om ostfinns i re3 med in kollar python ost == varje värde i listan
så som din lista ser ut nu finns det inte något värde i listan som är ost
ost är en dock en del av värdet "ormkokoormroskossakol hummer häst gås gås flower får Fido orm apa ost" men det klara inte in av att hitta
limy17
@limy17
Nov 06 2017 12:19
Ok, vad bör jag använda istället då?
AndreasArne
@AndreasArne
Nov 06 2017 12:20
jag hade ändrat hur du lägger in värden i listan
jag antar att varje orde mellan " " , i "ormkokoormroskossakol hummer häst gås gås flower får Fido orm apa ost", är ett item som du har i din backpack
limy17
@limy17
Nov 06 2017 12:21
Såhär går det till:
def backpack2(info2):
    """ Marvin handles inv pick. """
    with open("inv.data", "a") as filehandler:
        filehandler.write(info2 + " ")
        print("Marvin tog upp: " + str(info2))
AndreasArne
@AndreasArne
Nov 06 2017 12:22
och hur ser det ut när du läser upp innehållet
limy17
@limy17
Nov 06 2017 12:22
Detta finns i ryggsäcken: ['ormkokoormroskossakol hummer häst gås gås flower får Fido orm apa ost ']
AndreasArne
@AndreasArne
Nov 06 2017 12:23
tänkte på hur ser koden ut
limy17
@limy17
Nov 06 2017 12:23
def backpack1():
    """ Marvin handles input inv. """
    data_list = []
    with open("inv.data", "r") as filehandler:
        data_list = filehandler.readlines()
    print("Detta finns i ryggsäcken: " + str(data_list))
    return data_list
AndreasArne
@AndreasArne
Nov 06 2017 12:25
funktionen "readlines" returnerar en lista där varje rad blir ett eget värde i listan
limy17
@limy17
Nov 06 2017 12:26
Ok, så jag behöver en ny rad för varje nytt värde?
AndreasArne
@AndreasArne
Nov 06 2017 12:26
så du har två alternativ, antingen använder du funktionen read() istället, då läser du upp hela innehållet som en sträng och då får göra om strängen till en lista och välja " " som seperator för varje värde
eller ändrar du hur du lägger till nya värden i filen. Då ändrar du så du skriver ut värdet + newline
limy17
@limy17
Nov 06 2017 12:29
Det sista alt. kan se ut såhär eller?
filehandler.write(info2 + "\n")
AndreasArne
@AndreasArne
Nov 06 2017 12:29
men om du kör på ändra hur du skriver ut värde kommer du får ett newline på slutet av filen som blir ett tomt värde i din lista när du läser upp den
ja
limy17
@limy17
Nov 06 2017 12:29
Gör det ngt att det är ett tomt värde i slutet?
AndreasArne
@AndreasArne
Nov 06 2017 12:30
då behöver du ta bort sista newline från strängen innan du gör om den till en lista eller tar du bort sista värdet från listan efter du skapat det
jag har för mig att det har skapat problem för andra
limy17
@limy17
Nov 06 2017 12:31
Ok, så det första alternativet innebär att read() ersätter readlines() ?
AndreasArne
@AndreasArne
Nov 06 2017 12:31
ja
limy17
@limy17
Nov 06 2017 12:32
Jag testar nog det först. Tack för hjälpen! :)
AndreasArne
@AndreasArne
Nov 06 2017 12:32
:+1:
limy17
@limy17
Nov 06 2017 14:14

Jag skulle behöva lite hjälp med hur jag gör om string till lista.
Har försökt med list() och .split, men får detta svar av terminalen:
"res3.split(" ").pop(info3)
TypeError: 'str' object cannot be interpreted as an integer"

Och för en konverterad list-variabel, resList = list(res3):
"resList.pop(info3)
TypeError: 'str' object cannot be interpreted as an integer"

def backpack3(info3):
    """ Marvin handles inv drop. """
    res3 = backpack1()
    print(type(info3))
    print(type(res3))
    with open("inv.data", "r") as filehandler:
        filehandler.read()
        if info3 in res3:
            print("Marvin släppte: " + str(info3))
            res3.pop(info3)
        else:
            print("Finns inte i ryggsäcken")
Allinrep
@pejg12
Nov 06 2017 14:15
gör det ett steg i taget och använd print på variablerna däremellan
mylist = res3.split(" ")
print(mylist)
mypop = mylist.pop(info3)
print(mypop)
aha, nu förstår jag felmeddelandet
$ python3

>>> help(list.pop)

pop(...)
    L.pop([index]) -> item -- remove and return item at index (default last).
    Raises IndexError if list is empty or index is out of range.
Allinrep
@pejg12
Nov 06 2017 14:21
kommandot help() hämtar från manualen. där står det att pop() använder sig av index, alltså siffror.
limy17
@limy17
Nov 06 2017 14:21
mylist skrivs ut ut som en list, men inte mypop:
mypop = mylist.pop(info3)
TypeError: 'str' object cannot be interpreted as an integer
Jaha, gäller det alla funktioner specificerade för listor?
Remove, append m.m.?
Allinrep
@pejg12
Nov 06 2017 14:22
nej det har jag svårt att tro. du får kolla i manualen för varje funktion tills du lär dig vad som gör vad.
jag kollar i manualen ofta, det är svårt att komma ihåg alla parametrar till alla funktioner i alla olika språk
pythonmanualen är inte alls lika lätt att navigera som phpmanualen...
limy17
@limy17
Nov 06 2017 14:26
Ok
Allinrep
@pejg12
Nov 06 2017 14:26
help() hjälper mig ibland när jag inte hittar i onlinemanualen
öppna terminalen, kör python3 utan några argument för att starta pythoninterpretatorn, sen kan man skapa några enkla testvariabler och använda sig av help() för att ta reda på mer.
limy17
@limy17
Nov 06 2017 14:27
bra
limy17
@limy17
Nov 06 2017 14:45
Remove verkar fungera på annat än int, men uppdateringen av datafilen verkar inte hänga med till den första funktionen? Tar jag bort ordet "yxa" med funktionen backpack3, är det tillbaka igen om jag kör kommandot "inv" och backpack1.
def backpack1():
    """ Marvin handles input inv. """
    data_list = []
    with open("inv.data", "r") as filehandler:
        data_list = filehandler.read()
    print("Detta finns i ryggsäcken: " + str(data_list))
    return data_list

# > inv pick mumintrollet
# *marvin svarar med att han tog upp mumintrollet*
def backpack2(info2):
    """ Marvin handles inv pick. """
    with open("inv.data", "a") as filehandler:
        filehandler.write(info2 + " ")
        print("Marvin tog upp: " + str(info2))

def backpack3(info3):
    """ Marvin handles inv drop. """
    res3 = backpack1()
    print(type(info3))
    print(type(res3))
    mylist = res3.split(" ")
    with open("inv.data", "r") as filehandler:
        filehandler.read()
        if info3 in res3:
            print("Marvin släppte: " + str(info3))
            mylist.remove(info3)
            print('Updaterad ryggsäck: ', mylist)
        else:
            print("Finns inte i ryggsäcken")
Jag kollar vad som finns efter backpack3 med
print('Updaterad ryggsäck: ', mylist)
I terminalen:
inv drop yxa
Detta finns i ryggsäcken: ormkokoormroskossakol hummer häst gås gås flower får Fido orm apa ost apa apan viol snigel hus rose gräs sten vas snösnö snö yxa
Marvin släppte: yxa
Updaterad ryggsäck: ['ormkokoormroskossakol', 'hummer', 'häst', 'gås', 'gås', 'flower', 'får', 'Fido', 'orm', 'apa', 'ost', 'apa', 'apan', 'viol', 'snigel', 'hus', 'rose', 'gräs', 'sten', 'vas', 'snösnö', 'snö', '']
Press enter to continue...
inv
Detta finns i ryggsäcken: ormkokoormroskossakol hummer häst gås gås flower får Fido orm apa ost apa apan viol snigel hus rose gräs sten vas snösnö snö yxa
Allinrep
@pejg12
Nov 06 2017 14:50
samma fel som häromdagen, du uppdaterar bara pythons interna lista utan att uppdatera din filehandler
filen har ingen aning om vilka variabler som finns i python, det är två helt olika lager
du behöver också se över vilken bokstav du skickar med till open() så att det är en bokstav som möjliggör förändring av filen
limy17
@limy17
Nov 06 2017 14:53
r läser, w skriver och skriver över, a behåller
Är det korrekt?
Jag trodde filen var samma för alla funktioner, om man öppnade den i alla?
Att en förändring via en funktion, påverkade filen oavsett?
Allinrep
@pejg12
Nov 06 2017 15:23
för att förändra innehållet i filen så behöver du påverka variabeln som innehåller filen, i det här fallet filehandler
variabeln mylist kanske har samma innehåll som filen, men det är inte filen
a = "apa"
b = "apa"
# a och b innehåller samma sak

b = "banan"
# b är uppdaterad, men inte a
# de brukade innehålla samma värde, men uppdaterar man den ena så påverkas ändå inte den andra
konstruktionen with open(...) as variable så kopplar du variable till att peka på den riktiga filen, utan att bara vara en kopia.
limy17
@limy17
Nov 06 2017 15:28
Så istället för mylist i mylist.remove(info3) hade det behövt peka på filehandler istället?
Allinrep
@pejg12
Nov 06 2017 15:29
mylist är en lista som har listmetoder. filehandler är av en filtyp och behöver använda filmetoder.
kolla på write()