Que fait exactement la méthode .join ()?

209

Je suis assez nouveau sur Python et je suis complètement confus par .join() ce que j'ai lu est la méthode préférée pour concaténer des chaînes.

J'ai essayé:

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

et a obtenu quelque chose comme:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5

Pourquoi ça marche comme ça? Le 595juste ne devrait-il pas être ajouté automatiquement?

Matt McCormick
la source
1
Je pense que vous avez tapé sur votre Yubikey pendant que le programme était en cours
Trenton

Réponses:

303

Regardez attentivement votre sortie:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5
^                 ^                 ^

J'ai mis en évidence les "5", "9", "5" de votre chaîne d'origine. Le Pythonjoin() méthode est une méthode de chaîne et prend une liste d'éléments à joindre à la chaîne. Un exemple plus simple pourrait aider à expliquer:

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

Le "," est inséré entre chaque élément de la liste donnée. Dans votre cas, votre "liste" est la représentation de chaîne "595", qui est traitée comme la liste ["5", "9", "5"].

Il semble que vous recherchiez +plutôt:

print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
.tostring() + strid
Greg Hewgill
la source
1
Pourquoi n'est-ce pas: 5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5wlfgALGbXOahekxSs? Avec la chaîne ajoutée au dernier élément?
Matt McCormick
10
Une des raisons est que cela donne joinla propriété utile d'être l'inverse de split( docs.python.org/library/stdtypes.html#str.split )
cobbal
4
Si vous voulez un autre délimiteur, mettez une chaîne vide à la fin de votre liste. ','.join(['a', 'b', 'c', ''])donne "a, b, c,"
tgray
9
OP était probablement source string.joinde confusion avec os.path.joince qui concatène effectivement les chemins
Juan Campa
91

joinprend une chose itérable comme argument. C'est généralement une liste. Le problème dans votre cas est qu'une chaîne est elle-même itérable, donnant à tour de rôle chaque caractère. Votre code se décompose comme suit:

"wlfgALGbXOahekxSs".join("595")

qui agit de la même manière que ceci:

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

et produit ainsi votre chaîne:

"5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5"

Les chaînes comme itérables sont l'un des problèmes de début les plus déroutants avec Python.

Ned Batchelder
la source
8
upvote pour avoir souligné ce qui pourrait être le nœud de la confusion: les chaînes sont itérables donc elles agissent comme des listes de caractères.
Daniel Baird
59

Pour ajouter une chaîne, il suffit de la concaténer avec le +signe.

Par exemple

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

joinrelie les chaînes avec un séparateur. Le séparateur est ce que vous placez juste avant le join. Par exemple

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

Join prend une liste de chaînes comme paramètre.

Dan Loewenherz
la source
5
Ce type de réponse directe et concise devrait être préconisé par notre communauté. @Dan
DehengYe
7

join () sert à concaténer tous les éléments de la liste. Pour concaténer seulement deux chaînes "+" aurait plus de sens:

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

Pour développer un peu plus ce que disent les autres, si vous vouliez utiliser join pour simplement concaténer vos deux chaînes, vous feriez ceci:

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

Il y a une bonne explication des raisons pour lesquelles il est coûteux d'utiliser +pour concaténer un grand nombre de chaînes ici

L'opérateur Plus est une solution parfaitement adaptée pour concaténer deux chaînes Python. Mais si vous continuez à ajouter plus de deux chaînes (n> 25), vous voudrez peut-être penser à autre chose.

''.join([a, b, c]) astuce est une optimisation des performances.

ZakS
la source
0

En fournissant cela comme entrée,

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

Python renvoie ceci en sortie:

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

S'il s'agit d'une entrée, en utilisant la méthode JOIN, nous pouvons ajouter la distance entre les mots et également convertir la liste en chaîne.

Ceci est une sortie Python

'my name is kourosh'
kourosh
la source
0

"" .join peut être utilisé pour copier la chaîne d'une liste dans une variable

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