Co dokładnie robi metoda .join ()?

209

Jestem całkiem nowy w Pythonie i jestem całkowicie zdezorientowany, .join()ponieważ przeczytałem, że jest preferowaną metodą łączenia łańcuchów.

Próbowałem:

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

i dostałem coś takiego:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5

Dlaczego tak to działa? Czy nie powinno 595się automatycznie dodawać?

Matt McCormick
źródło
1
Myślę, że dotknąłeś swojego Yubikey podczas trwania programu
Trenton

Odpowiedzi:

303

Przyjrzyj się uważnie swojej produkcji:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5
^                 ^                 ^

Podkreśliłem „5”, „9”, „5” oryginalnego ciągu. Metoda Python join()jest metodą łańcuchową i wymaga listy rzeczy do połączenia z łańcuchem. Prostszy przykład może pomóc wyjaśnić:

>>> ",".join(["a", "b", "c"])
'a,b,c'

Znak „,” jest wstawiany między każdy element podanej listy. W twoim przypadku twoja „lista” to ciąg znaków „595”, który jest traktowany jak lista [„5”, „9”, „5”].

Wygląda na to, że +zamiast tego szukasz :

print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
.tostring() + strid
Greg Hewgill
źródło
1
Dlaczego tak nie jest: 5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5wlfgALGbXOahekxSs? Z ciągiem dołączonym do ostatniego elementu?
Matt McCormick,
10
Jednym z powodów jest to, że daje jointo przydatną właściwość bycia odwrotnością split( docs.python.org/library/stdtypes.html#str.split )
cobbal
4
Jeśli chcesz inny separator, umieść pusty ciąg na końcu listy. ','.join(['a', 'b', 'c', ''])daje „a, b, c”
tgray
9
OP prawdopodobnie myliło się string.joinz tym, os.path.joinco rzeczywiście łączy ścieżki
Juan Campa
91

joinprzyjmuje iterowalną rzecz jako argument. Zwykle jest to lista. Problem w twoim przypadku polega na tym, że sam łańcuch jest iterowalny, wydzielając kolejno każdy znak. Twój kod dzieli się na następujące:

"wlfgALGbXOahekxSs".join("595")

który działa tak samo jak to:

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

i tak tworzy ciąg:

"5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5"

Ciągi jako iterowalne to jeden z najbardziej zagmatwanych początkowych problemów z Pythonem.

Ned Batchelder
źródło
8
głosowanie za wskazaniem, co może być sednem zamieszania: ciągi są iterowalne, więc działają jak listy znaków.
Daniel Baird
59

Aby dodać ciąg, po prostu połącz go ze +znakiem.

Na przykład

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

joinłączy ciągi znaków z separatorem. Separator jest tym, co umieszczasz tuż przed join. Na przykład

>>> "-".join([a,b])
'Hello, -world'

Join przyjmuje listę ciągów jako parametr.

Dan Loewenherz
źródło
5
Tego rodzaju bezpośrednia i zwięzła odpowiedź powinna być wspierana przez naszą społeczność. @Dan
DehengYe
7

Join () służy do łączenia wszystkich elementów listy. Aby połączyć tylko dwa ciągi „+” miałoby większy sens:

strid = repr(595)
print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
    .tostring() + strid
Pēteris Caune
źródło
4

Aby rozszerzyć nieco więcej na to, co mówią inni, jeśli chcesz użyć funkcji złączenia, aby po prostu połączyć swoje dwa ciągi, wykonaj następujące czynności:

strid = repr(595)
print ''.join([array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
    .tostring(), strid])
Jorenko
źródło
2

Jest to dobre wytłumaczenie, dlaczego to jest kosztowne w użyciu +na łączenie wielu ciągów tutaj

Operator Plus jest doskonałym rozwiązaniem do łączenia dwóch ciągów Python. Ale jeśli dodajesz więcej niż dwa ciągi (n> 25), możesz pomyśleć o czymś innym.

''.join([a, b, c]) trick to optymalizacja wydajności.

ZakS
źródło
0

Po podaniu tego jako danych wejściowych,

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

Python zwraca to jako wynik:

'server=mpilgrim;uid=sa;database=master;pwd=secret'
Akash Kandpal
źródło
0
list = ["my", "name", "is", "kourosh"]   
" ".join(list)

Jeśli jest to dane wejściowe, za pomocą metody JOIN możemy dodać odległość między słowami, a także przekonwertować listę na ciąg.

To jest wyjście Pythona

'my name is kourosh'
kourosh
źródło
0

„” .join może być użyte do skopiowania ciągu z listy do zmiennej

>>> myList = list("Hello World")
>>> myString = "".join(myList)
>>> print(myList)
['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
>>> print(myString)
Hello World
Jaskółka oknówka
źródło