Γιατί είναι string.join(list) αντί για list.join(string);

Αυτό πάντα με μπέρδευε. Φαίνεται ότι αυτό θα ήταν καλύτερο:

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

από αυτό:

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

Υπάρχει κάποιος συγκεκριμένος λόγος που είναι έτσι;

Λύση

Αυτό συμβαίνει επειδή οποιαδήποτε επαναληπτική μεταβλητή μπορεί να ενωθεί, όχι μόνο λίστες, αλλά το αποτέλεσμα και ο "joiner" είναι πάντα συμβολοσειρές.

Για παράδειγμα:

import urllib2
print('\n############\n'.join(
    urllib2.urlopen('http://data.stackexchange.com/users/7095')))
Σχόλια (11)

Επειδή η μέθοδος join() βρίσκεται στην κλάση string, αντί για την κλάση list;

Συμφωνώ ότι φαίνεται περίεργο.

Βλέπε http://www.faqs.org/docs/diveintopython/odbchelper_join.html:

Ιστορική σημείωση. Όταν έμαθα για πρώτη φορά Python, περίμενα ότι η join θα ήταν μια μέθοδος

μιας λίστας, η οποία θα έπαιρνε την οριοθέτη ως όρισμα. Πολλές άνθρωποι αισθάνονται το ίδιο, και υπάρχει μια ιστορία πίσω από τη μέθοδο join. Προηγούμενη στην Python 1.6, οι συμβολοσειρές δεν είχαν όλα τα αυτές τις χρήσιμες μεθόδους. Υπήρχε μια ξεχωριστή ενότητα συμβολοσειρών που περιείχε όλες τις συναρτήσεις συμβολοσειρών. συνάρτηση έπαιρνε μια συμβολοσειρά ως πρώτη της όρισμα. Οι συναρτήσεις θεωρούνταν αρκετά σημαντικές ώστε να τοποθετηθούν στο τις ίδιες τις συμβολοσειρές, πράγμα που είχε νόημα για συναρτήσεις όπως lower, upper και split. Αλλά πολλοί σκληροπυρηνικοί Python προγραμματιστές διαφώνησαν με τη νέα ένωση μέθοδο, υποστηρίζοντας ότι θα έπρεπε να είναι μια μέθοδος της λίστας, ή ότι θα έπρεπε να είναι δεν θα έπρεπε να μετακινηθεί καθόλου αλλά απλά να παραμείνει μέρος της παλιάς ενότητας string (η οποία εξακολουθεί να περιέχει πολλά χρήσιμα πράγματα). Χρησιμοποιώ αποκλειστικά τη νέα μέθοδο join, αλλά θα δείτε κώδικα γραμμένο είτε τρόπο, και αν πραγματικά σας ενοχλεί, μπορείτε να μπορείτε να χρησιμοποιήσετε την παλιά συνάρτηση string.join. αντ' αυτού.

--- Mark Pilgrim, Dive into Python

Σχόλια (1)

Κυρίως επειδή το αποτέλεσμα μιας someString.join() είναι μια συμβολοσειρά.

Η ακολουθία (λίστα ή πλειάδα ή οτιδήποτε άλλο) δεν εμφανίζεται στο αποτέλεσμα, παρά μόνο ένα αλφαριθμητικό. Επειδή το αποτέλεσμα είναι ένα αλφαριθμητικό, έχει νόημα ως μέθοδος ενός αλφαριθμητικού.

Σχόλια (0)