文字列のリストからコンマ区切りの文字列をどのように作成しますか?


528

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

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

回答:


969
my_list = ['a', 'b', 'c', 'd']
my_string = ','.join(my_list)
'a,b,c,d'

リストに整数が含まれている場合、これは機能しません


リストに文字列以外のタイプ(整数、浮動小数点数、ブール値、なしなど)が含まれている場合は、次のようにします。

my_string = ','.join(map(str, my_list)) 

Python 2.7を使用している場合(現時点では使用すべきではありません)、リスト内のいずれかの項目にUnicodeがある場合、strを使用すると例外が発生します。
kroiz

75

なぜ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)

18

",".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'

StringIOPython 3にはありません
Ron Kalian

4
@RonKalian from io import StringIOPython 3での使用
Kevin Ashcraft

13

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

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


11

あなただけが欲しいのではありません:

",".join(l)

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

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


10

@ピーター・ホフマン

ジェネレータ式を使用すると、イテレータも作成できるという利点がありますが、イテレータのインポートは節約されます。さらに、リスト内包表記は一般にmapよりも優先されます。したがって、ジェネレータ式はimapよりも優先されると思います。

>>> l = [1, "foo", 4 ,"bar"]
>>> ",".join(str(bit) for bit in l)
'1,foo,4,bar' 

7
>>> my_list = ['A', '', '', 'D', 'E',]
>>> ",".join([str(i) for i in my_list if i])
'A,D,E'

my_list任意のタイプの変数を含めることができます。これは結果を避け'A,,,D,E'ます。


4
l=['a', 1, 'b', 2]

print str(l)[1:-1]

Output: "'a', 1, 'b', 2"

1
このページの他のソリューションとは異なり、文字列も引用することを指摘しておく必要があると思います。
mrdevlar 2018

3

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

from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join(imap(str, l))

このソリューションは、空の文字列に余分なコンマを追加しない、およびNoneTypeで 'None'を追加するという要件を満たしていません。
ロベルト

ジェネレーターと比較しstr.joinlist、作業をより速くチェック
Grijesh Chauhan

3

これはリストの例です

>>> 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

1
この質問は、リストのリストではなく、リストに関するものでした
Eero Aaltonen

@EeroAaltonen私の回答を更新しました。

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


しかし、それは他の答えに比べてあまりにも複雑すぎませんか?
Sreenikethan I

0

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

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

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

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

要素にコンマが含まれる可能性がある場合、結果の文字列は解析が難しくなりますが、csvダグラスが彼の答えで指摘しているように、モジュールの全機能が必要です。)


-2

私の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'

それはpythonicで、文字列、数値、なし、空の文字列で機能します。それは短く、要件を満たしています。リストに数値が含まれない場合は、次の簡単なバリエーションを使用できます。

>>> ','.join(ifilter(lambda x: x, l))

また、このソリューションは新しいリストを作成しませんが、@ Peter Hoffmannが指摘したようなイテレータを使用します(ありがとう)。


これは不必要です。受け入れられた答えは単純で直接的で、明らかに最良の解決策です。過度に複雑な選択肢を提供することは、時間の無駄です。既に実行可能な答えがあるときに、言語の他の機能について単に教育しようとしているだけであれば、私が反対したのと同じことをしています。
クリアライト2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.