.join()メソッドは正確には何をしますか?


209

私はPythonにかなり慣れて.join()いないため、文字列を連結するための推奨される方法であるPythonを完全に混乱させています。

私は試した:

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

そして、次のようなものを得ました:

5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5

なぜこのように機能するのですか?595自動的に追加されるべきではありませんか?


1
プログラムの実行中にユビキーをタップしたと思います
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
1つの理由は、これが(docs.python.org/library/stdtypes.html#str.split)のjoin逆であるという有用な特性を与えるsplit
cobbal

4
別の区切り文字が必要な場合は、リストの最後に空の文字列を置きます。','.join(['a', 'b', 'c', ''])"a、b、c、"を
返します

9
OPはおそらくstring.joinos.path.join実際にパスを連結するものと混同していました
ファンカンパ2014年

91

join引数として反復可能なものを取ります。通常はリストです。あなたの場合の問題は、文字列自体が反復可能であり、各文字を順番に出力することです。あなたのコードはこれに分解されます:

"wlfgALGbXOahekxSs".join("595")

これはこれと同じように機能します:

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

そしてあなたの文字列を生成します:

"5wlfgALGbXOahekxSs9wlfgALGbXOahekxSs5"

イテラブルとしての文字列は、Pythonで最もわかりにくい最初の問題の1つです。


8
混乱の要点を指摘するための賛成票:文字列は反復可能であるため、文字のリストのように機能します。
Daniel Baird 2014

59

文字列を追加するには、それを+記号で連結するだけです。

例えば

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

join文字列をセパレータで結合します。セパレータは、の直前に配置するものですjoin。例えば

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

Joinは、文字列のリストをパラメーターとして受け取ります。


5
この種の直接的かつ簡潔な答えは、私たちのコミュニティによって提唱されるべきです。@ダン
DehengYe

7

join()は、すべてのリスト要素を連結するためのものです。2つの文字列 "+"のみを連結する場合、より意味があります。

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

4

他の人が言っていることをもう少し詳しく説明するには、結合を使用して2つの文字列を単純に連結したい場合は、次のようにします。

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

2

ここに+多数の文字列を連結するために使用するのにコストがかかる理由についての良い説明があります

Plus演算子は、2つの Python文字列を連結するための完全に優れたソリューションです。しかし、3つ以上の文字列(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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.