O que exatamente o método .join () faz?

209

Eu sou muito novo em Python e estou completamente confuso com .join() que li como o método preferido para concatenar seqüências de caracteres.

Eu tentei:

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

e tem algo como:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5

Por que funciona assim? O 595just não deve ser automaticamente anexado?

Matt McCormick
fonte
1
Eu acho que você bateu seu Yubikey enquanto o programa estava funcionando
Trenton

Respostas:

303

Observe atentamente sua saída:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5
^                 ^                 ^

Eu destaquei os "5", "9", "5" da sua string original. O join()método Python é um método de cadeia de caracteres e leva uma lista de itens a serem associados à cadeia de caracteres. Um exemplo mais simples pode ajudar a explicar:

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

O "," é inserido entre cada elemento da lista fornecida. No seu caso, sua "lista" é a representação de cadeia "595", que é tratada como a lista ["5", "9", "5"].

Parece que você está procurando +:

print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
.tostring() + strid
Greg Hewgill
fonte
1
Por que não é: 5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5wlfgALGbXOahekxSs? Com a string anexada ao último elemento?
9789 Matt McCormick
10
Uma das razões é o que dá joina propriedade útil de ser o inverso split( docs.python.org/library/stdtypes.html#str.split )
cobbal
4
Se você quiser outro delimitador, coloque uma string vazia no final da sua lista. ','.join(['a', 'b', 'c', ''])dá "a, b, c,"
tgray 09/12/2009
9
OP provavelmente estava confuso string.joincom os.path.joino que de fato concatena caminhos
Juan Campa
91

jointoma uma coisa iterável como argumento. Geralmente é uma lista. O problema no seu caso é que uma string é iterável, fornecendo cada caracter por vez. Seu código é dividido em:

"wlfgALGbXOahekxSs".join("595")

que age da mesma maneira:

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

e assim produz sua string:

"5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5"

Strings como iterables é um dos problemas iniciais mais confusos com o Python.

Ned Batchelder
fonte
8
voto positivo por apontar o que pode ser o cerne da confusão: as strings são iteráveis ​​e, portanto, agem como listas de caracteres.
Daniel Baird
59

Para acrescentar uma sequência, concatene-a com o +sinal.

Por exemplo

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

joinconecta seqüências de caracteres com um separador. O separador é o que você coloca logo antes do join. Por exemplo

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

Join leva uma lista de strings como parâmetro.

Dan Loewenherz
fonte
5
Esse tipo de resposta direta e concisa deve ser defendida por nossa comunidade. @Dan
DehengYe
7

join () é para concatenar todos os elementos da lista. Para concatenar apenas duas strings "+", faria mais sentido:

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

Para expandir um pouco mais o que os outros estão dizendo, se você quiser usar join para simplesmente concatenar suas duas strings, faça o seguinte:

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

Há uma boa explicação de por que é caro usar +para concatenar um grande número de strings aqui

O operador Plus é a solução perfeita para concatenar dois seqüências de caracteres Python. Mas se você continuar adicionando mais de duas strings (n> 25), poderá pensar em outra coisa.

''.join([a, b, c]) O truque é uma otimização de desempenho.

ZakS
fonte
0

Ao fornecer isso como entrada,

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

Python retorna isso como saída:

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

Se for uma entrada, usando o método JOIN, podemos adicionar a distância entre as palavras e também converter a lista na string.

Esta é a saída Python

'my name is kourosh'
kourosh
fonte
0

"" .join pode ser usado para copiar a string em uma lista para uma variável

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