Pourquoi est-ce string.join(list) au lieu de list.join(string) ?

Cela m'a toujours dérouté. Il semble que ce serait plus agréable :

my_list = ["Hello", "world"]
print(my_list.join("-"))
# Produce: "Hello-world"

que ça :

my_list = ["Hello", "world"]
print("-".join(my_list))
# Produce: "Hello-world"

Y a-t-il une raison spécifique pour laquelle il en est ainsi ?

Solution

C'est parce que n'importe quel itérable peut être joint, pas seulement les listes, mais le résultat et le "joiner" sont toujours des chaînes de caractères.

Par exemple :

import urllib2
print('\n############\n'.join(
    urllib2.urlopen('http://data.stackexchange.com/users/7095')))
Commentaires (11)

Parce que la méthode join() est dans la classe string, au lieu de la classe list ?

Je suis d'accord, ça a l'air bizarre.

Voir http://www.faqs.org/docs/diveintopython/odbchelper_join.html :

Note historique. Lorsque j'ai appris pour la première fois Python, je m'attendais à ce que join soit une méthode d'une liste, qui prendrait le délimiteur comme argument. Beaucoup de gens beaucoup de gens pensent la même chose, et il y a une histoire derrière la méthode join. Avant Avant Python 1.6, les chaînes ne disposaient pas de toutes méthodes utiles. Il existait un > module string séparé module string séparé qui contenait toutes les fonctions de chaînes ; chaque fonction prenait une chaîne de caractères comme premier argument. Ces fonctions ont été jugées suffisamment importantes pour être placées sur les chaînes de caractères elles-mêmes, ce qui était logique pour des fonctions comme lower, upper, et diviser. Mais de nombreux programmeurs Python purs et durs Python se sont opposés à la nouvelle méthode nouvelle méthode join, arguant qu'elle devrait plutôt être une méthode de la liste ou qu'elle devrait être une méthode de la liste. une méthode de la liste, ou qu'elle ne devrait pas ou qu'elle ne devrait pas bouger du tout mais simplement rester de l'ancien module string (qui a toujours des module string (qui contient encore beaucoup de choses utiles). J'utilise exclusivement la nouvelle méthode join, mais vous verrez du code écrit de l'une ou l'autre mais vous verrez du code écrit de l'une ou l'autre façon, et si cela vous dérange vraiment, vous pouvez utiliser l'ancienne méthode string.join. pouvez utiliser l'ancienne fonction string.join à la place.

--- Mark Pilgrim, Dive into Python (en anglais)

Commentaires (1)

Principalement parce que le résultat d'une someString.join() est une chaîne de caractères.

La séquence (liste ou tuple ou autre) n'apparaît pas dans le résultat, juste une chaîne. Parce que le résultat est une chaîne de caractères, cela a du sens en tant que méthode d'une chaîne de caractères.

Commentaires (0)