630

連続する 2 つのペアごとにコンマが追加されるように、シーケンスから文字列を連結するための好ましい方法は何でしょうか。つまり、たとえば にどのようにマッピングします['a', 'b', 'c']'a,b,c'? (ケース['s']およびは、それぞれおよび[]にマップする必要があります。)'s'''

私は通常、 のようなものを使用してしまいますが''.join(map(lambda x: x+',',l))[:-1]、少し不満を感じています。

4

15 に答える 15

1180
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)) 
于 2008-09-04T21:06:12.030 に答える
85

なぜ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)
于 2008-09-04T21:08:29.420 に答える
24

",".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'
于 2016-02-10T15:43:06.703 に答える
15

文字列以外のリスト項目を許可する 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')"
    

注: コンマの後のスペースは意図的なものです。

于 2008-10-01T09:23:00.990 に答える
14

@ピーター・ホフマン

ジェネレーター式を使用すると、反復子も生成されるという利点がありますが、インポートする itertools を節約できます。さらに、リスト内包表記は一般にマップよりも優先されるため、ジェネレーター式は imap よりも優先されると予想されます。

>>> l = [1, "foo", 4 ,"bar"]
>>> ",".join(str(bit) for bit in l)
'1,foo,4,bar' 
于 2008-09-05T16:29:25.553 に答える
13

あなたはただしたくないですか:

",".join(l)

値にカンマなどを引用/エスケープする必要がある場合は、明らかに複雑になります。その場合、標準ライブラリの csv モジュールを見ることをお勧めします。

https://docs.python.org/library/csv.html

于 2008-09-04T21:09:33.770 に答える
6
l=['a', 1, 'b', 2]

print str(l)[1:-1]

Output: "'a', 1, 'b', 2"
于 2008-09-15T18:08:41.643 に答える
5

リスト内包表記を使用する@jmanning2kには、新しい一時リストを作成するという欠点があります。より良い解決策は、イテレータを返す itertools.imap を使用することです

from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join(imap(str, l))
于 2008-09-04T21:57:51.050 に答える
1

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 です。

于 2018-06-18T15:08:24.447 に答える
0

私が何かを見逃していない限り、','.join(foo)あなたが求めていることをするべきです。

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

(編集: jmanning2k が指摘するように、

','.join([str(x) for x in foo])

csv要素にコンマを含めることができる場合、結果の文字列を解析するのは難しくなりますが、より安全で非常に Pythonic です。その時点で、Douglas が彼の回答で指摘しているように、モジュールの全機能が必要です。)

于 2008-09-04T21:10:25.483 に答える
0

うーん、SQLも必要です:

l = ["foo" , "baar" , 6]
where_clause = "..... IN ("+(','.join([ f"'{x}'" for x in l]))+")"
>> "..... IN ('foo','baar','6')"

楽しむ

于 2021-11-26T14:44:54.493 に答える