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.

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

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)

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'

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.



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' 

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


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

print str(l)[1:-1]

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

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

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

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.


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


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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.