This has always confused me. It seems like this would be nicer:
my_list = ["Hello", "world"] print my_list.join("-") # Produce: "Hello-world"
my_list = ["Hello", "world"] print "-".join(my_list) # Produce: "Hello-world"
Is there a specific reason it is like this?
It's because any iterable can be joined, not just lists, but the result and the "joiner" are always strings.
import urllib2 print '\n############\n'.join( urllib2.urlopen('http://data.stackexchange.com/users/7095'))
This was discussed in the String methods... finally thread in the Python-Dev achive, and was accepted by Guido. This thread began in Jun 1999, and
str.join was included in Python 1.6 which was released in Sep 2000 (and supported Unicode). Python 2.0 (supported
str methods including
join) was released in Oct 2000.
joinas a built-in function
tuples, but all sequences/iterables.
seq.reduce(str)is difficult for new-comers.
seq.join(str)introduces unexpected dependency from sequences to str/unicode.
join()as a built-in function would support only specific data types. So using a built in namespace is not good. If
join()supports many datatypes, creating optimized implementation would be difficult, if implemented using the
__add__method then it's O(n²).
sep) should not be omitted. Explicit is better than implicit.
There are no other reasons offered in this thread.
Here are some additional thoughts (my own, and my friend's):
Guido's decision is recorded in a historical mail, deciding on
Funny, but it does seem right! Barry, go for it...
--Guido van Rossum