Що саме робить метод .join ()?


209

Я досить новачок у Python, і я абсолютно збентежений, .join()коли я прочитав - це кращий метод об'єднання рядків.

Я намагався:

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

і вийшло щось на кшталт:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5

Чому це працює так? Чи не слід 595просто додавати автоматично?


1
Я думаю, ви натискали свій Yubikey під час роботи програми
Trenton

Відповіді:


303

Подивіться уважно на результат:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5
^                 ^                 ^

Я виділив "5", "9", "5" вашого початкового рядка. Метод Python join()- це рядковий метод і містить список речей, які слід з'єднати з рядком. Більш простий приклад може допомогти пояснити:

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

Між кожним елементом даного списку вставляється ",". У вашому випадку ваш "список" - це рядкове представлення "595", яке трактується як список ["5", "9", "5"].

Схоже, ви шукаєте +натомість:

print array.array('c', random.sample(string.ascii_letters, 20 - len(strid)))
.tostring() + strid

1
Чому це не так: 5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5wlfgALGbXOahekxSs? З доданим рядком до останнього елемента?
Метт Маккормік

10
Однією з причин цього joinє корисна властивість бути зворотним split( docs.python.org/library/stdtypes.html#str.split )
кабал

4
Якщо ви хочете ще один роздільник, покладіть порожній рядок у кінці списку. ','.join(['a', 'b', 'c', ''])дає "а, б, в",
tgray

9
OP, ймовірно , плутає string.joinз os.path.joinякої дійсно об'єднуючим шляхом
Juan Čampa

91

joinсприймає ітерабельну річ як аргумент. Зазвичай це список. Проблема у вашому випадку полягає в тому, що рядок є ітерабельним, видаючи кожен символ по черзі. Ваш код розбивається на це:

"wlfgALGbXOahekxSs".join("595")

який діє так само, як це:

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

і таким чином виробляє ваш рядок:

"5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5"

Струни як ітерабелі - одна з найбільш заплутаних початкових проблем з Python.


8
підсумок для вказівки на те, що може бути сутністю плутанини: рядки є ітерабельними, тому вони діють як списки знаків.
Даніель Бейрд

59

Щоб додати рядок, просто з'єднайте його зі +знаком.

Напр

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

joinз'єднує рядки разом з роздільником. Сепаратор - це те, що ви розміщуєте прямо перед join. Напр

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

Join приймає список рядків як параметр.


5
Така пряма і лаконічна відповідь повинна обстоюватися нашою громадою. @Dan
DehengYe

7

join () призначений для об'єднання всіх елементів списку. Для об'єднання лише двох рядків "+" було б більше сенсу:

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

4

Щоб розширити трохи більше того, що говорять інші, якщо ви хочете скористатися приєднанням, щоб просто об'єднати свої два рядки, ви зробите це:

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

2

Існує гарне пояснення того , чому це дорого використовувати +для конкатенації великої кількості рядків тут

Оператор Plus - прекрасне рішення для об'єднання двох рядків Python. Але якщо ви продовжуєте додавати більше двох рядків (n> 25), можливо, ви захочете подумати про щось інше.

''.join([a, b, c]) трюк - оптимізація продуктивності.


0

Надаючи це як вхід,

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

Python повертає це як вихід:

'server=mpilgrim;uid=sa;database=master;pwd=secret'

0
list = ["my", "name", "is", "kourosh"]   
" ".join(list)

Якщо це вхід, використовуючи метод JOIN, ми можемо додати відстань між словами, а також перетворити список у рядок.

Це вихід Python

'my name is kourosh'

0

"" .join може використовуватися для копіювання рядка в списку до змінної

>>> myList = list("Hello World")
>>> myString = "".join(myList)
>>> print(myList)
['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
>>> print(myString)
Hello World
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.