文字のリストを文字列に変換します


回答:


585

次のjoinように、空の文字列のメソッドを使用して、すべての文字列を空の文字列で結合します。

>>> a = ['a', 'b', 'c', 'd']
>>> ''.join(a)
'abcd'

1
文字の間にスペースを追加するにはどうすればよいですか?とにかく、全体を繰り返すことなくそれを行うには?
clifgray 2013

18
ただやる' '.join(list)引用符の間にスペースを
clifgray

これについての良いことは、各アイテムの新しい行を含むテキストにリストを書きたい場合に '\ n'.join(a)を使用できることです
Norfeldt

28
明確にする:"".join(['a','b','c'])はを意味しJoin all elements of the array, separated by the string ""ます。同様に、" hi ".join(["jim", "bob", "joe"])が作成されます"jim hi bob hi joe"
Jack

39

これはJavaScriptやRubyなどの多くの一般的な言語で動作しますが、Pythonでは動作しません。

>>> ['a', 'b', 'c'].join('')
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'join'

奇妙なことに、Pythonではjoinメソッドはstrクラスにあります。

# this is the Python way
"".join(['a','b','c','d'])

オブジェクトのjoinメソッドlistがJavaScriptや他の一般的なスクリプト言語のようになっていないのはなぜですか?これは、Pythonコミュニティの考え方の一例です。joinは文字列を返すため、リストクラスではなく文字列クラスに配置する必要があるため、str.join(list)メソッドは、リストをstr区切り文字として使用して新しい文字列に結合します(この場合strは空の文字列です)。

どういうわけか私はしばらくしてこの考え方が好きになりました。私はPythonデザインの多くのことについて不満を言うことができますが、その一貫性については不満はありません。


1
joinがリストメソッドではなく文字列メソッドであることの主な理由は、リストだけでなく、反復可能なを受け入れることです。ジェネレータ式、辞書、セット、さまざまな種類のビューなどを使用できます。そのため、ほとんどの言語の配列結合操作よりもはるかに柔軟です。
rosuav

多くの動的言語でメソッドstring.join()を持っているほとんどのコレクションとPythonを比較していましたjoin()。イテラブルについては、join()メソッドのコレクションコンストラクターとチェーンにイテラブルを含めるのと同じくらい簡単(かつ読みやすい)なので、そのような言語では問題にならないと思います。
Paulo Scardine

ええ、それらがレイジーリスト(Haskellスタイル)を持っているか、開始する前にリストをメモリに統合することに慣れていると仮定します。私の要点は、Pythonのやり方は恣意的ではなく、非常に正当な理由があるということです。
rosuav

1
これは任意ではなく、すべてのクラスで名前空間の汚染を回避するための設計上の決定です。:-)
Paulo Scardine

丁度。さらに、これらすべてがクラスであるわけではありません。「反復可能」はプロトコルであり、クラスではありません。イテラブルを使用して、フィルタリング、マッピング、結合などを行うことができます。
rosuav

15

Pythonインタープリターが古い場合(たとえば、一部の古いLinuxディストリビューションでは一般的な1.5.2)、join()古い文字列オブジェクトのメソッドとして使用できない場合があり、代わりに文字列モジュールを使用する必要があります。例:

a = ['a', 'b', 'c', 'd']

try:
    b = ''.join(a)

except AttributeError:
    import string
    b = string.join(a, '')

文字列bはになります'abcd'


10

これが最も速い方法かもしれません:

>> from array import array
>> a = ['a','b','c','d']
>> array('B', map(ord,a)).tostring()
'abcd'

4
@WinstonEwertはい、昨日は私がそんなことをする必要があるプログラムを書いていた、と私は私のプログラムでは、この行数のパフォーマンスのためにいくつかの方法をベンチマーク結果が示すことは、20%の高速化についてです''.join(['a','b','c'])
bigeagle

2
私自身のベンチマークは、参加が7倍高速であることを示しています。pastebin.com/8nSc5Ek1。ベンチマークを共有してもよろしいですか?
Winston Ewert

1
@WinstonEwertあなたは正しいです。私はこれの理由を見つけました:私のプログラムでは、ネットワークからintのリストを受け取り、map(ord,a)不要な場所で文字列に変換しますが、結合が必要map(chr,a)です。ここに私のベンチマークだpastebin.com/1sKFm8ma
bigeagle

15
時期尚早の最適化。これは、何が起こっているのかを読んで理解するのが非常に困難です。ユーザーが操作のパフォーマンスを必要としない限り、単純な方''.join()がはるかに読みやすくなります。
Luiz Damim、2012年

5
そう思わない-プログラマーはそのようなことのために最速の方法を心に留めておく必要があります。少し時間がかかる単一の簡単な操作は大したことではありません。ただし、これは、作成されたすべてのプログラムが肥大化し、リソースを大量に消費することになります。可能な限り無駄を省く習慣を身に付けないと、Windows VistaやLinuxのUpstartのような世界は、次のような多くの小さなショートカットの良い例になります水中で死んだように、「膨らんで浮く」。どちらも醜いです。なぜ(STRを使用していない)を100%表現力imfho ...ある()に参加。
osirisgothra

4

リデュース機能も動作します

import operator
h=['a','b','c','d']
reduce(operator.add, h)
'abcd'

1
オペレーターはそれ自体が一流の市民ではないことをいつも私は悩ませています。たとえば、スキームでは(reduce + h)
Brian Minton

スキームでは、(reduce + '' h)または(apply + h)動作します。ただし、Pythonでは、add演算子は2つのオペランドを使用するため、reduceが必要です。それ以外の場合は、拡張呼び出し構文(別名en.wikipedia.org/wiki/Variadic_function)を支持して正式にPythonで非推奨にoperator.add(*h)なっapplyているため、実行できます
Brian Minton

3

リストには数字が含まれている場合は、使用することができますmap()join()

例えば:

>>> arr = [3, 30, 34, 5, 9]
>>> ''.join(map(str, arr))
3303459

使用する方が実際にはもっとpythonicです''.join([str(i) for i in arr])
user1767754

@ user1767754まあ、Guidoはそのスタイルを好みますが、map関数の使用には何の問題もありません。
itsbruce、

2
h = ['a','b','c','d','e','f']
g = ''
for f in h:
    g = g + f

>>> g
'abcdef'

6
これはかなり遅いでしょう。を使用''.join(h)すると、1つずつ追加するメソッドをはるかに上回ります。
Martijn Pieters

1
'the' python聖書(1400以上の1ページ目)では、多くの場所で、これは誤りであり、可能な限り回避する必要があることを示しています。これは、知られていないpython初心者の痛いほど明白な商標でもあります(機能を侮辱しないように...まあ)機能する可能性がありますが、約5000人から「これを行わないでください」と聞こえます。
osirisgothra 2015

2

ほかにstr.join最も自然な方法である、可能性が使用することですio.StringIOし、悪用writelines一度のすべての要素を書くこと:

import io

a = ['a','b','c','d']

out = io.StringIO()
out.writelines(a)
print(out.getvalue())

プリント:

abcd

このアプローチをジェネレーター関数またはa tupleまたはa ではないイテラブルで使用するとlist、一時的なリスト作成が保存されます。join、適切なサイズを一度に割り当てるためされます(1文字の文字列のリストはメモリの点で非常に高価です) )。

メモリが少なく、入力として遅延評価されたオブジェクトがある場合、このアプローチが最適なソリューションです。


0

次のoperator.concat()ように使用することもできます。

>>> from operator import concat
>>> a = ['a', 'b', 'c', 'd']
>>> reduce(concat, a)
'abcd'

Python 3を使用している場合は、先頭に追加する必要があります。

>>> from functools import reduce

組み込みreduce()がPython 3から削除され、現在はに存在するためfunctools.reduce()

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.