Hva gjør egentlig .join()-metoden?

Jeg er ganske ny i Python og er helt forvirret av .join() som jeg har lest er den foretrukne metoden for å sammenkoble strenger.

Jeg har prøvd:

strid = repr(595)
print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
    .tostring().join(strid)

og fikk noe sånt som:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5

Hvorfor fungerer det slik? Burde ikke 595 bare legges til automatisk?

Løsning

Se nøye på resultatene dine:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5
^                 ^                 ^

Jeg har uthevet "5", "9", "5" av den opprinnelige strengen din. Python-metoden join() er en strengmetode, og tar en liste med ting som skal sammenføyes med strengen. Et enklere eksempel kan bidra til å forklare:

>>> ",".join(["a", "b", "c"])
'a,b,c'

"," settes inn mellom hvert element i den gitte listen. I ditt tilfelle er "listen" strengrepresentasjonen "595", som behandles som listen ["5", "9", "5"].

Det ser ut til at du leter etter + i stedet:

print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
.tostring() + strid
Kommentarer (4)

join tar en itererbar ting som et argument. Vanligvis er det en liste. Problemet i ditt tilfelle er at en streng i seg selv er itererbar, og gir ut hvert tegn etter tur. Koden din brytes ned til dette:

"wlfgALGbXOahekxSs".join("595")

som fungerer på samme måte som dette:

"wlfgALGbXOahekxSs".join(["5", "9", "5"])

og produserer dermed strengen din:

"5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5"

Strenger som iterables er en av de mest forvirrende begynnelsesproblemene med Python.

Kommentarer (1)

join() er for sammenkjeding av alle listeelementer. For sammenkjeding av bare to strenger "+" ville være mer fornuftig:

strid = repr(595)
print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
    .tostring() + strid
Kommentarer (0)