Pourquoi est-ce string.join(list)
au lieu de list.join(string)
?
C'est parce que join
c'est une méthode "chaîne"! Il crée une chaîne à partir de n'importe quel itérable. Si nous avons collé la méthode sur des listes, qu'en est-il lorsque nous avons des itérables qui ne sont pas des listes?
Et si vous avez un tuple de cordes? S'il s'agissait d'une list
méthode, vous devriez list
convertir chaque itérateur de chaînes en un avant de pouvoir joindre les éléments en une seule chaîne! Par exemple:
some_strings = ('foo', 'bar', 'baz')
Lançons notre propre méthode de jointure de liste:
class OurList(list):
def join(self, s):
return s.join(self)
Et pour l'utiliser, notez que nous devons d'abord créer une liste à partir de chaque itérable pour joindre les chaînes dans cet itérable, gaspillant à la fois de la mémoire et de la puissance de traitement:
>>> l = OurList(some_strings) # step 1, create our list
>>> l.join(', ') # step 2, use our list join method!
'foo, bar, baz'
Nous voyons donc que nous devons ajouter une étape supplémentaire pour utiliser notre méthode de liste, au lieu d'utiliser simplement la méthode de chaîne intégrée:
>>> ' | '.join(some_strings) # a single step!
'foo | bar | baz'
Avertissement de performance pour les générateurs
L'algorithme utilisé par Python pour créer la chaîne finale str.join
doit en fait passer deux fois sur l'itérable, donc si vous lui fournissez une expression de générateur, il doit d'abord le matérialiser dans une liste avant de pouvoir créer la chaîne finale.
Ainsi, bien que le fait de contourner les générateurs soit généralement meilleur que les compréhensions de liste, il str.join
s'agit d'une exception:
>>> import timeit
>>> min(timeit.repeat(lambda: ''.join(str(i) for i in range(10) if i)))
3.839168446022086
>>> min(timeit.repeat(lambda: ''.join([str(i) for i in range(10) if i])))
3.339879313018173
Néanmoins, l' str.join
opération est toujours sémantiquement une opération "chaîne", il est donc logique de l'avoir sur l' str
objet que sur divers itérables.
-
déclare que vous joignez une liste et que vous la convertissez en chaîne. Elle est orientée vers les résultats.