Was genau macht die .join () -Methode?

209

Ich bin ziemlich neu in Python und bin völlig verwirrt darüber, .join()was ich gelesen habe, ist die bevorzugte Methode zum Verketten von Zeichenfolgen.

Ich habe es versucht:

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

und bekam so etwas wie:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5

Warum funktioniert das so? Sollte das nicht 595einfach automatisch angehängt werden?

Matt McCormick
quelle
1
Ich denke, Sie haben Ihren Yubikey getippt, während das Programm lief
Trenton

Antworten:

303

Schauen Sie sich Ihre Ausgabe genau an:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5
^                 ^                 ^

Ich habe die "5", "9", "5" Ihrer ursprünglichen Zeichenfolge hervorgehoben. Die Python- join()Methode ist eine Zeichenfolgenmethode und enthält eine Liste der Dinge, die mit der Zeichenfolge verknüpft werden sollen. Ein einfacheres Beispiel könnte helfen, Folgendes zu erklären:

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

Das "," wird zwischen jedem Element der angegebenen Liste eingefügt. In Ihrem Fall ist Ihre "Liste" die Zeichenfolgendarstellung "595", die als Liste ["5", "9", "5"] behandelt wird.

Es scheint, dass Sie +stattdessen suchen :

print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
.tostring() + strid
Greg Hewgill
quelle
1
Warum ist es nicht: 5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5wlfgALGbXOahekxSs? Mit der Zeichenfolge an das letzte Element angehängt?
Matt McCormick
10
Ein Grund dafür ist joindie nützliche Eigenschaft, die Umkehrung von split( docs.python.org/library/stdtypes.html#str.split )
Cobbal
4
Wenn Sie ein anderes Trennzeichen möchten, setzen Sie eine leere Zeichenfolge am Ende Ihrer Liste. ','.join(['a', 'b', 'c', ''])gibt "a, b, c"
tgray
9
OP war wahrscheinlich verwirrend, string.joinmit os.path.joindem tatsächlich Pfade verkettet
Juan Campa
91

joinnimmt eine iterierbare Sache als Argument. Normalerweise ist es eine Liste. Das Problem in Ihrem Fall ist, dass eine Zeichenfolge selbst iterierbar ist und jedes Zeichen der Reihe nach ausgibt. Ihr Code lautet wie folgt:

"wlfgALGbXOahekxSs".join("595")

was genauso verhält:

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

und so entsteht dein String:

"5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5"

Strings als iterables ist eines der verwirrendsten Anfangsprobleme mit Python.

Ned Batchelder
quelle
8
Gegenstimme, um darauf hinzuweisen, was der Kern der Verwirrung sein könnte: Zeichenfolgen sind iterierbar, sodass sie sich wie Listen von Zeichen verhalten.
Daniel Baird
59

Um eine Zeichenfolge anzuhängen, verknüpfen Sie sie einfach mit dem +Zeichen.

Z.B

>>> a = "Hello, "
>>> b = "world"
>>> str = a + b
>>> print str
Hello, world

joinverbindet Strings mit einem Trennzeichen. Das Trennzeichen platzieren Sie direkt vor dem join. Z.B

>>> "-".join([a,b])
'Hello, -world'

Join verwendet eine Liste von Zeichenfolgen als Parameter.

Dan Loewenherz
quelle
5
Diese Art der direkten und präzisen Antwort sollte von unserer Community befürwortet werden. @ Dan
DehengYe
7

join () dient zum Verketten aller Listenelemente. Für die Verkettung von nur zwei Zeichenfolgen wäre "+" sinnvoller:

strid = repr(595)
print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
    .tostring() + strid
Pēteris Caune
quelle
4

Wenn Sie Join verwenden möchten, um Ihre beiden Zeichenfolgen einfach zu verketten, gehen Sie folgendermaßen vor:

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

Es gibt eine gute Erklärung dafür, warum es teuer ist, hier+ eine große Anzahl von Zeichenfolgen zu verketten

Plus Operator ist eine perfekte Lösung, um zwei zu verketten Python-Zeichenfolgen . Wenn Sie jedoch immer mehr als zwei Zeichenfolgen hinzufügen (n> 25), möchten Sie möglicherweise etwas anderes denken.

''.join([a, b, c]) Trick ist eine Leistungsoptimierung.

ZakS
quelle
0

Wenn Sie dies als Eingabe bereitstellen,

li = ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
s = ";".join(li)
print(s)

Python gibt dies als Ausgabe zurück:

'server=mpilgrim;uid=sa;database=master;pwd=secret'
Akash Kandpal
quelle
0
list = ["my", "name", "is", "kourosh"]   
" ".join(list)

Wenn dies eine Eingabe ist, können wir mit der JOIN-Methode den Abstand zwischen den Wörtern hinzufügen und die Liste auch in die Zeichenfolge konvertieren.

Dies ist die Python-Ausgabe

'my name is kourosh'
Kourosh
quelle
0

"" .join kann verwendet werden, um die Zeichenfolge in einer Liste in eine Variable zu kopieren

>>> myList = list("Hello World")
>>> myString = "".join(myList)
>>> print(myList)
['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
>>> print(myString)
Hello World
Martin
quelle