文字列のリストからカンマ区切りの文字列を作成するにはどうすればよいでしょうか?
質問
連続する 2 つのペアの間にカンマが追加されるように、シーケンスの文字列を連結する好ましい方法は何ですか。つまり、たとえば、どのようにマッピングするかということです。 [ 'a', 'b', 'c' ]
に 'a,b,c'
?(事例 [ s ]
そして []
にマッピングする必要があります s
そして ''
, 、 それぞれ。)
私は通常次のようなものを使用することになります ''.join(map(lambda x: x+',',l))[:-1]
, 、でもどこか物足りなさも感じます。
編集:解決策がとても簡単だったことが恥ずかしく、また嬉しく思います。明らかに、私は自分が何をしているのかについてほとんど手がかりがありません。(おそらく過去に「単純な」連結が必要で、どういうわけか覚えていました s.join([e1,e2,...])
の略記として s+e1+e2+...
.)
解決
myList = ['a','b','c','d']
myString = ",".join(myList )
リストに数字が含まれている場合、これは機能しません。
として リカルド・レイエス 非文字列型 (整数、浮動小数点数、ブール値、None など) が含まれている場合は、次のようにすることをお勧めします。
myList = ','.join(map(str, myList))
他のヒント
なぜマップ/ラムダマジックなのか?これは機能しませんか?
>>>foo = [ 'a', 'b', 'c' ]
>>>print ",".join(foo)
a,b,c
>>>print ",".join([])
>>>print ",".join(['a'])
a
編集:@mark-biek は数字の場合を指摘しています。おそらくリストの内包表記は次のようになります。
>>>','.join([str(x) for x in foo])
より「パイソン的」です。
編集2:ご提案ありがとうございます。今後はリスト内包表記ではなくジェネレーターを使用する予定です。
>>>','.join(str(x) for x in foo)
",".join(l)
すべてのケースで機能するわけではありません。StringIO で csv モジュールを使用することをお勧めします
import StringIO
import csv
l = ['list','of','["""crazy"quotes"and\'',123,'other things']
line = StringIO.StringIO()
writer = csv.writer(line)
writer.writerow(l)
csvcontent = line.getvalue()
# 'list,of,"[""""""crazy""quotes""and\'",123,other things\r\n'
以下は、文字列以外のリスト項目を許可する Python 3.0 の代替ソリューションです。
>>> alist = ['a', 1, (2, 'b')]
標準的な方法
>>> ", ".join(map(str, alist)) "a, 1, (2, 'b')"
代替の解決策
>>> import io >>> s = io.StringIO() >>> print(*alist, file=s, sep=', ', end='') >>> s.getvalue() "a, 1, (2, 'b')"
注記:カンマの後のスペースは意図的に入っています。
@ピーター・ホフマン
ジェネレーター式を使用すると、イテレーターも生成されるという利点がありますが、itertools のインポートが節約されます。さらに、リスト内包表記は一般にマップよりも好まれるため、生成式は imap よりも好まれると予想されます。
>>> l = [1, "foo", 4 ,"bar"]
>>> ",".join(str(bit) for bit in l)
'1,foo,4,bar'
単に欲しいだけではありません:
",".join(l)
値の中でカンマを引用符で囲んだりエスケープしたりする必要がある場合は、明らかに複雑になります。その場合は、標準ライブラリの csv モジュールを確認することをお勧めします。
>>> my_list = ['A', '', '', 'D', 'E',]
>>> ",".join([str(i) for i in my_list if i])
'A,D,E'
my_list
任意のタイプの変数を含めることができます。これにより結果が回避されます 'A,,,D,E'
.
リスト内包表記を使用する @jmanning2k には、新しい一時リストが作成されるという欠点があります。より良い解決策は、イテレータを返す itertools.imap を使用することです。
from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join(imap(str, l))
数値を含むリストを変換するには、次の手順を実行します。
string = ''.join([str(i) for i in list])
l=['a', 1, 'b', 2]
print str(l)[1:-1]
Output: "'a', 1, 'b', 2"
何かが欠けていなければ、 ','.join(foo)
あなたが求めていることをすべきです。
>>> ','.join([''])
''
>>> ','.join(['s'])
's'
>>> ','.join(['a','b','c'])
'a,b,c'
(編集:jmanning2k が指摘しているように、
','.join([str(x) for x in foo])
はより安全で非常に Python 的ですが、要素にカンマが含まれる可能性がある場合、結果の文字列を解析するのは難しくなります。その時点で、 csv
ダグラスが答えで指摘しているように、モジュール。)
これはリスト付きの例です
>>> myList = [['Apple'],['Orange']]
>>> myList = ','.join(map(str, [i[0] for i in myList]))
>>> print "Output:", myList
Output: Apple,Orange
より正確な:-
>>> myList = [['Apple'],['Orange']]
>>> myList = ','.join(map(str, [type(i) == list and i[0] for i in myList]))
>>> print "Output:", myList
Output: Apple,Orange
例 2:-
myList = ['Apple','Orange']
myList = ','.join(map(str, myList))
print "Output:", myList
Output: Apple,Orange
私ならこう言います csv
library は、文字列内のカンマなどのすべての CSV ユースケースに対応するように構築されているため、ここでは唯一の賢明なオプションです。
リストを出力するには l
.csv ファイルに:
import csv
with open('some.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(l) # this will output l as a single row.
を使用することも可能です writer.writerows(iterable)
複数行をcsvに出力します。
ここで使用されている他の回答のように、この例は Python 3 と互換性があります。 StringIO
それがPython 2です。
このようなことを少しだけ:)
String = "Once:Upon:a:Time:A:Long:Time:Ago"
ding = String.split(':')
ring = (" , ").join(ding)
print(ring)
出力:一度、上に、a、時間、A、長い、時間、前
私の2セント。私は Python のシンプルな 1 行コードの方が好きです。
>>> from itertools import imap, ifilter
>>> l = ['a', '', 'b', 1, None]
>>> ','.join(imap(str, ifilter(lambda x: x, l)))
a,b,1
>>> m = ['a', '', None]
>>> ','.join(imap(str, ifilter(lambda x: x, m)))
'a'
これはPython的で、文字列、数値、None、空の文字列に対して機能します。短くて要件を満たしています。リストに数値が含まれない場合は、次のより単純なバリエーションを使用できます。
>>> ','.join(ifilter(lambda x: x, l))
また、このソリューションは新しいリストを作成しませんが、@Peter Hoffmann が指摘したように反復子を使用します (感謝)。