2009-12-09 7 views
144

Je suis assez nouveau à Python et suis complètement confus par .join() que j'ai lu est la méthode préférée pour la concaténation des chaînes.Que fait exactement la méthode .join()?

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 595 ne devrait-il pas être ajouté automatiquement? Join() permet de concaténer tous les éléments de la liste.

+0

Je pense que vous avez tapé votre Yubikey alors que le programme est exécuté en – Trenton

Répondre

237

Regardez attentivement votre sortie:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5 
^    ^    ^

Je l'ai souligné le "5", "9", "5" de votre chaîne d'origine. La méthode Python join() est une méthode de chaîne et prend une liste de choses à joindre à la chaîne. Un exemple plus simple peut 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 sous forme de chaîne "595", qui est traitée comme la liste ["5", "9", "5"].

Il semble que vous cherchez + à la place:

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

Pourquoi n'est-ce pas: 5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5wlfgALGbXOahekxSs? Avec la chaîne ajoutée au dernier élément? –

+6

Une des raisons est que cela donne 'join' la propriété utile d'être l'inverse de' split' (http://docs.python.org/library/stdtypes.html#str.split) – cobbal

+3

Si vous voulez un autre délimiteur, mettez un chaîne vide à la fin de votre liste. '','. join (['a', 'b', 'c', ''])' donne "a, b, c," – tgray

7

Pour concaténer seulement deux chaînes « + » serait plus logique:

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

join prend une chose itérable comme argument. Habituellement, c'est une liste. Le problème dans votre cas est qu'une chaîne est elle-même itérable, distribuant chaque personnage à son tour. Votre code se décompose à ceci:

"wlfgALGbXOahekxSs".join("595") 

qui agit de la même que celle-ci:

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

et produit ainsi votre chaîne:

"5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5" 

Strings comme iterables est l'un des plus confus début des problèmes avec Python.

+5

upvote pour souligner ce qui pourrait être le noeud de la confusion: les chaînes sont itératives afin qu'ils agissent comme des listes de caractères. –

44

Pour ajouter une chaîne, juste concaténer avec le signe +.

E.g.

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

join relie 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' 

La jointure prend une liste de chaînes en tant que paramètre.

+3

Ce type de réponse directe et concise devrait être préconisé par notre communauté. @Dan – DehengYe

4

Pour développer un peu plus sur ce que les autres disent, si vous vouliez utiliser se joindre à concaténer simplement 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]) 
0

En fournissant cela comme entrée,

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

Python retourne cette sortie comme:

'server=mpilgrim;uid=sa;database=master;pwd=secret'