連続する 2 つのペアごとにコンマが追加されるように、シーケンスから文字列を連結するための好ましい方法は何でしょうか。つまり、たとえば にどのようにマッピングします['a', 'b', 'c']
か'a,b,c'
? (ケース['s']
およびは、それぞれおよび[]
にマップする必要があります。)'s'
''
私は通常、 のようなものを使用してしまいますが''.join(map(lambda x: x+',',l))[:-1]
、少し不満を感じています。
my_list = ['a', 'b', 'c', 'd']
my_string = ','.join(my_list)
'a,b,c,d'
リストに整数が含まれている場合、これは機能しません
リストに文字列以外の型 (integer、float、bool、None など) が含まれている場合は、次のようにします。
my_string = ','.join(map(str, my_list))
なぜmap
/lambda
マジックなのですか? これは機能しませんか?
>>> foo = ['a', 'b', 'c']
>>> print(','.join(foo))
a,b,c
>>> print(','.join([]))
>>> print(','.join(['a']))
a
リストに数字がある場合は、リスト内包表記を使用できます。
>>> ','.join([str(x) for x in foo])
またはジェネレーター式:
>>> ','.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 モジュールを見ることをお勧めします。
l=['a', 1, 'b', 2]
print str(l)[1:-1]
Output: "'a', 1, 'b', 2"
リスト内包表記を使用する@jmanning2kには、新しい一時リストを作成するという欠点があります。より良い解決策は、イテレータを返す itertools.imap を使用することです
from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join(imap(str, l))
csv
ライブラリは、文字列内のコンマなどのすべての 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 です。
私が何かを見逃していない限り、','.join(foo)
あなたが求めていることをするべきです。
>>> ','.join([''])
''
>>> ','.join(['s'])
's'
>>> ','.join(['a','b','c'])
'a,b,c'
(編集: jmanning2k が指摘するように、
','.join([str(x) for x in foo])
csv
要素にコンマを含めることができる場合、結果の文字列を解析するのは難しくなりますが、より安全で非常に Pythonic です。その時点で、Douglas が彼の回答で指摘しているように、モジュールの全機能が必要です。)
うーん、SQLも必要です:
l = ["foo" , "baar" , 6]
where_clause = "..... IN ("+(','.join([ f"'{x}'" for x in l]))+")"
>> "..... IN ('foo','baar','6')"
楽しむ