[Python] String veranderen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Chip.
  • Registratie: Mei 2006
  • Niet online
Ik ben nu bezig met bekend te worden met python en nu tijdens een klein opdrachtje kwam ik een probleempje tegen waar ik me nogal aan erger... Namelijk toen ik een string wou manipuleren in een while loop...

Python:
1
2
3
    while i < iLenName: 
        if sName[i] == sGuess[i]:
            sCorrect[i] = sName[i]


Hier is iLenName de lengte van een te raden naam en sName is de correcte naam en sGuess is door de user gegokte naam. sCorrect is een string met puntjes waarin de correcte letters worden gezet wanneer de gebruiker letters goed heeft gegokt.

Nu is het probleem dat dit bovenstaande dus niet werkt. Van python mag je blijkbaar niet 1 karakter manipuleren... Maar opvragen en vergelijken kan dus weer wel 8)7

Ik had dit dus als volgt opgelost door gewoon de string maar op te bouwen in de while loop...

Python:
1
2
3
4
5
    while i < iLenName: 
        if sName[i] == sGuess[i]:
            sCorrect += sName[i]
        else:
            sCorrect += '.'


Echter vind ik dit eigenlijk niet echt een goeie methode dus ik vroeg me af of iemand een betere methode had?

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-09 16:37

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom vind je het geen goede methode?
Een andere manier is trouwens om een array van tekens te gebruiken, waar je achteraf een string van maakt. Een array is namelijk wel mutable.

[ Voor 65% gewijzigd door .oisyn op 12-03-2009 15:29 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
In veel programmeer talen is String een Immutable object, je kunt een string dus niet wijzigen. Als je iets dergelijks wilt doen zou je bijvoorbeeld een array met chars kunnen gebruiken.

In Java en .NET heb je ook nog iets als een StringBuilder class ( Die intern weer een buffer met char's bevat ) om strings op te bouwen. Ik weet niet of Python ook standaard een dergelijke class heeft, maar je zou er eens naar kunnen kijken.

[ Voor 42% gewijzigd door Woy op 12-03-2009 15:31 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • supakeen
  • Registratie: December 2000
  • Laatst online: 09-09 14:42
De string in Python is immutable.

Gebruik hiervoor een list in Python, lists zijn hiervoor bedoeld en zijn wel mutable i.t.t. tuples en strings :)

Acties:
  • 0 Henk 'm!

  • Chip.
  • Registratie: Mei 2006
  • Niet online
Oke maar dan zit ik weer met andere dingetjes... bijvoorbeeld het printen van zo'n list als een string moet je dus

Python:
1
2
list = ['w', 'o', 'u', 't', 'e', 'r']
print(''.join(list))


Dat staat niet echt net imo, dat je dus eerst even een string uit 0 karakters moet typen zeg maar ''. Daar moet toch een andere truc voor zijn?

Het creeeren van een list uit een string gaat ook maar wazig :?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
string = input() #Wouter\r
a = ['']
a.pop()
a.append(string[:-1])
print(a) #['Wouter']

a.pop()

i = 0 
while i < len(string[:-1]):
    a.append(string[i])
    i += 1
    
print(a) #['W', 'o', 'u', 't', 'e', 'r']


als ik niet eerst a = [''] deed weet a niet dat hij een list is... dus dat moet ik nog eerst doen en daarna pop omdat ik die lege entry helemaal niet wil hebben... Vervolgens append(string)... echter krijg ik dan alles in 1 list dus een loopje...

Acties:
  • 0 Henk 'm!

  • Devilly
  • Registratie: Januari 2009
  • Niet online
als ik niet eerst a = [''] deed weet a niet dat hij een list is... dus dat moet ik nog eerst doen en daarna pop omdat ik die lege entry helemaal niet wil hebben...
Je kunt gewoon het volgende typen:

code:
1
a = []


Dan maakt hij een lege lijst aan. Dat moet in ieder geval één van je problemen oplossen. Het is namelijk zo dat die aanhalingstekens die jij erin plaats een string definiëren die al in de list wordt geplaatst.

Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Je kan ook gewoon het volgende doen:
code:
1
charList = list(eenString)


En vervolgens je gewenste bewerking doen en dan weer terug naar string met join.

Het lijkt mij overigens beter als die sCorrect altijd een list is en alleen bij tonen aan de gebruiker converteren naar een string.

[ Voor 29% gewijzigd door Remus op 12-03-2009 16:40 ]


Acties:
  • 0 Henk 'm!

  • Chip.
  • Registratie: Mei 2006
  • Niet online
Devilly schreef op donderdag 12 maart 2009 @ 16:23:
[...]


Je kunt gewoon het volgende typen:

code:
1
a = []


Dan maakt hij een lege lijst aan. Dat moet in ieder geval één van je problemen oplossen. Het is namelijk zo dat die aanhalingstekens die jij erin plaats een string definiëren die al in de list wordt geplaatst.
Hmmm raar volgens mij had ik dat namelijk geprobeerd en toen kreeg ik een error (zal wel typ fout hebben gemaakt en er te snel over een hebben gekeken) Maar dat werkt wel ja :) bedankt.

Maar er is geen andere mogelijkheid voor ''.join(string) ?

Acties:
  • 0 Henk 'm!

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Wouser schreef op donderdag 12 maart 2009 @ 16:38:
Maar er is geen andere mogelijkheid voor ''.join(string) ?
Er zijn zat alternatieven, maar die zijn of langer, of performen slechter.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 14:10
Wouser schreef op donderdag 12 maart 2009 @ 16:38:
Hmmm raar volgens mij had ik dat namelijk geprobeerd en toen kreeg ik een error (zal wel typ fout hebben gemaakt en er te snel over een hebben gekeken) Maar dat werkt wel ja :) bedankt.
Of gewoon de constructor aanroepen:
Python:
1
a=list()

(Overigens kun je net zo goed [ ] schrijven zoals Devilly suggereert; ik wil alleen maar aangeven dat je bijna álle types kunt construeren met een constructor call, dus ligt het voor de hand om dat ook te proberen met lijsten.)
Maar er is geen andere mogelijkheid voor ''.join(string) ?
Je kunt ook zoiets doen, als je dat mooier vind:
Python:
1
2
3
4
5
from operator import add
# ..
x = list("foobar")
# ..
print reduce(add, x)

Als je het graag korter wil, kun je natuurlijk zelf een functie definiëren en die gebruiken.

Acties:
  • 0 Henk 'm!

  • Sh4wn
  • Registratie: December 2006
  • Laatst online: 12-11-2017

Sh4wn

Bio-informatica

Wat is er mis met ''.join(list) O_O

Daarnaast heb je jouw probleem zelf al opgelost, waarom zou het geen goede methode zijn?

[ Voor 56% gewijzigd door Sh4wn op 13-03-2009 14:24 ]

Pagina: 1