Bagaimana Anda membuat string yang dipisahkan koma dari daftar string?

529

Apa yang akan menjadi cara pilihan Anda untuk menggabungkan string dari urutan sedemikian rupa sehingga antara setiap dua pasangan berturut-turut ditambahkan koma. Artinya, bagaimana Anda peta, misalnya, ['a', 'b', 'c']untuk 'a,b,c'? (Kasus ['s']dan []harus dipetakan ke 's'dan '', masing-masing.)

Saya biasanya berakhir menggunakan sesuatu seperti ''.join(map(lambda x: x+',',l))[:-1], tetapi juga merasa agak tidak puas.

mweerden
sumber

Jawaban:

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

Ini tidak akan berfungsi jika daftar berisi bilangan bulat


Dan jika daftar berisi tipe non-string (seperti integer, float, bools, None) maka lakukan:

my_string = ','.join(map(str, my_list)) 
Mark Biek
sumber
Catatan jika Anda menggunakan python 2.7 (yang seharusnya tidak Anda lakukan sekarang) maka menggunakan str akan memunculkan eksepsi jika ada item dalam daftar yang memiliki unicode.
kroiz
75

Kenapa map/ lambdasihir? Tidakkah ini berhasil?

>>> foo = ['a', 'b', 'c']
>>> print(','.join(foo))
a,b,c
>>> print(','.join([]))

>>> print(','.join(['a']))
a

Jika ada nomor dalam daftar, Anda bisa menggunakan pemahaman daftar:

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

atau ekspresi generator:

>>> ','.join(str(x) for x in foo)
jmanning2k
sumber
18

",".join(l)tidak akan bekerja untuk semua kasus. Saya sarankan menggunakan modul csv dengan StringIO

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'
Ricky
sumber
Tidak ada StringIOdalam Python 3
Ron Kalian
4
@RonKalian Digunakan from io import StringIOdalam Python 3
Kevin Ashcraft
13

Berikut adalah solusi alternatif di Python 3.0 yang memungkinkan item daftar non-string:

>>> alist = ['a', 1, (2, 'b')]
  • cara standar

    >>> ", ".join(map(str, alist))
    "a, 1, (2, 'b')"
  • solusi alternatif

    >>> import io
    >>> s = io.StringIO()
    >>> print(*alist, file=s, sep=', ', end='')
    >>> s.getvalue()
    "a, 1, (2, 'b')"

CATATAN: Ruang setelah koma disengaja.

jfs
sumber
11

Jangan hanya ingin:

",".join(l)

Jelas itu menjadi lebih rumit jika Anda perlu mengutip / melarikan diri koma dll dalam nilai. Dalam hal ini saya menyarankan melihat modul csv di perpustakaan standar:

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

Douglas Leeder
sumber
10

@Peter Hoffmann

Menggunakan ekspresi generator memiliki keuntungan juga menghasilkan iterator tetapi menghemat impor itertools. Selain itu, daftar pemahaman umumnya lebih disukai untuk dipetakan, oleh karena itu, saya berharap ekspresi generator lebih disukai untuk diterapkan.

>>> l = [1, "foo", 4 ,"bar"]
>>> ",".join(str(bit) for bit in l)
'1,foo,4,bar' 
Aaron Maenpaa
sumber
7
>>> my_list = ['A', '', '', 'D', 'E',]
>>> ",".join([str(i) for i in my_list if i])
'A,D,E'

my_listdapat berisi semua jenis variabel. Ini menghindari hasilnya 'A,,,D,E'.

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

print str(l)[1:-1]

Output: "'a', 1, 'b', 2"
AlvaroAV
sumber
1
Saya pikir Anda harus menunjukkan bahwa tidak seperti solusi lain di halaman ini, Anda juga mengutip string.
mrdevlar
3

@ jmanning2k menggunakan daftar pemahaman memiliki kelemahan membuat daftar sementara baru. Solusi yang lebih baik akan menggunakan itertools.imap yang mengembalikan iterator

from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join(imap(str, l))
Peter Hoffmann
sumber
Solusi ini tidak memenuhi persyaratan untuk tidak menambahkan koma ekstra untuk string kosong dan menambahkan 'Tidak Ada' dengan NoneType.
Roberto
periksa str.join bekerja lebih cepat dengan listdibandingkan dengan generator
Grijesh Chauhan
3

Berikut ini adalah contoh dengan daftar

>>> myList = [['Apple'],['Orange']]
>>> myList = ','.join(map(str, [i[0] for i in myList])) 
>>> print "Output:", myList
Output: Apple,Orange

Lebih tepat:-

>>> myList = [['Apple'],['Orange']]
>>> myList = ','.join(map(str, [type(i) == list and i[0] for i in myList])) 
>>> print "Output:", myList
Output: Apple,Orange

Contoh 2: -

myList = ['Apple','Orange']
myList = ','.join(map(str, myList)) 
print "Output:", myList
Output: Apple,Orange

sumber
1
Pertanyaan ini tentang daftar, bukan daftar daftar .
Eero Aaltonen
@ EeroAaltonen saya memperbarui jawaban saya, terima kasih telah menunjukkan saya ke kanan.
1

Saya akan mengatakan csv perpustakaan adalah satu-satunya pilihan yang masuk akal di sini, karena itu dibangun untuk mengatasi semua kasus penggunaan csv seperti koma dalam string, dll.

Untuk menampilkan daftar lke file .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.  

Juga dimungkinkan untuk digunakan writer.writerows(iterable) beberapa baris ke csv.

Contoh ini kompatibel dengan Python 3, karena jawaban lain StringIOyang digunakan di sini adalah Python 2.

Ron Kalian
sumber
Tetapi bukankah itu terlalu banyak / rumit dibandingkan dengan jawaban lain?
Sreenikethan I
0

Kecuali saya melewatkan sesuatu, ','.join(foo)harus melakukan apa yang Anda minta.

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

(sunting: dan seperti yang ditunjukkan jmanning2k,

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

lebih aman dan cukup Pythonic, meskipun string yang dihasilkan akan sulit untuk diurai jika elemen dapat mengandung koma - pada saat itu, Anda memerlukan kekuatan penuh dari csvmodul, seperti yang ditunjukkan oleh Douglas dalam jawabannya.)

David Singer
sumber
-2

Dua sen saya. Saya suka lebih mudah kode satu baris dengan python:

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

Ini pythonic, berfungsi untuk string, angka, Tidak ada dan string kosong. Ini pendek dan memenuhi persyaratan. Jika daftar tidak akan berisi angka, kita dapat menggunakan variasi yang lebih sederhana ini:

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

Juga solusi ini tidak membuat daftar baru, tetapi menggunakan iterator, seperti @Peter Hoffmann menunjuk (terima kasih).

Roberto
sumber
Ini berlebihan. Jawaban yang diterima sederhana, langsung dan jelas solusi terbaik. Memberikan alternatif yang terlalu rumit adalah buang-buang waktu tanpa tujuan. Jika Anda hanya mencoba untuk mendidik tentang fitur-fitur lain dari bahasa ketika sudah ada jawaban yang layak, Anda melakukan hal yang sama dengan Anda menurunkan saya.
clearlight