¿Qué hace exactamente el método .join ()?

209

Soy bastante nuevo en Python y estoy completamente confundido por .join() lo que he leído es el método preferido para concatenar cadenas.

Lo intenté:

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

y obtuve algo como:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5

¿Por qué funciona así? ¿No debería 595simplemente agregarse automáticamente?

Matt McCormick
fuente
1
Creo que tocaste tu Yubikey mientras se ejecutaba el programa
Trenton

Respuestas:

303

Mire cuidadosamente su salida:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5
^                 ^                 ^

He resaltado el "5", "9", "5" de su cadena original. El join()método Python es un método de cadena y toma una lista de cosas para unir con la cadena. Un ejemplo más simple podría ayudar a explicar:

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

El "," se inserta entre cada elemento de la lista dada. En su caso, su "lista" es la representación de cadena "595", que se trata como la lista ["5", "9", "5"].

Parece que estás buscando en su +lugar:

print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
.tostring() + strid
Greg Hewgill
fuente
1
¿Por qué no es así: 5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5wlfgALGbXOahekxSs? ¿Con la cadena añadida al último elemento?
Matt McCormick
10
Una razón es que le da joinla propiedad útil de ser el inverso de split( docs.python.org/library/stdtypes.html#str.split )
cobbal
44
Si desea otro delimitador, coloque una cadena vacía al final de su lista. ','.join(['a', 'b', 'c', ''])da "a, b, c"
tgray
9
OP probablemente fue confuso string.joincon lo os.path.joinque efectivamente concatena caminos
Juan Campa
91

jointoma una cosa iterable como argumento. Por lo general, es una lista. El problema en su caso es que una cadena es en sí misma iterable, dando a cada carácter a su vez. Su código se descompone en esto:

"wlfgALGbXOahekxSs".join("595")

que actúa igual que esto:

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

y así produce tu cadena:

"5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5"

Las cadenas como iterables son uno de los problemas iniciales más confusos con Python.

Ned Batchelder
fuente
8
voto positivo por señalar cuál podría ser el quid de la confusión: las cadenas son iterables, por lo que actúan como listas de caracteres.
Daniel Baird
59

Para agregar una cadena, simplemente concatene con el +signo.

P.ej

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

joinconecta las cadenas juntas con un separador. El separador es lo que coloca justo antes de join. P.ej

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

Join toma una lista de cadenas como parámetro.

Dan Loewenherz
fuente
55
Este tipo de respuesta directa y concisa debe ser defendida por nuestra comunidad. @Dan
DehengYe
7

join () es para concatenar todos los elementos de la lista. Para concatenar solo dos cadenas "+" tendría más sentido:

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

Para ampliar un poco más lo que otros dicen, si quisieras usar join para simplemente concatenar tus dos cadenas, harías esto:

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

Hay una buena explicación de por qué es costoso usarlo +para concatenar una gran cantidad de cadenas aquí

El operador Plus es una solución perfecta para concatenar dos cadenas de Python. Pero si sigue agregando más de dos cadenas (n> 25), es posible que desee pensar en otra cosa.

''.join([a, b, c]) El truco es una optimización del rendimiento.

ZakS
fuente
0

Al proporcionar esto como entrada,

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

Python devuelve esto como salida:

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

Si esto es una entrada, usando el método JOIN, podemos agregar la distancia entre las palabras y también convertir la lista a la cadena.

Esta es la salida de Python

'my name is kourosh'
kourosh
fuente
0

"" .join puede usarse para copiar la cadena de una lista a una variable

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