Dizeler listesinden virgülle ayrılmış bir dize nasıl oluşturabilirsiniz?


528

Ardışık her iki çift arasında bir virgül eklenecek şekilde dizeleri bir diziden birleştirmenin tercih edilen yolu ne olurdu. Olduğunu, nasıl, örneğin, harita yapmak ['a', 'b', 'c']için 'a,b,c'? (Olgu ['s']ve []eşlenmesi 's've ''sırasıyla).

Genellikle böyle bir şey kullanıyorum ''.join(map(lambda x: x+',',l))[:-1], ama aynı zamanda biraz tatminsiz hissediyorum.

Yanıtlar:


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

Liste tamsayılar içeriyorsa bu çalışmaz


Listede dize olmayan türler (tamsayılar, kayan noktalar, bools, None gibi) varsa, şunları yapın:

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

Python 2.7 kullanıyorsanız (şimdiye kadar yapmamanız gerekir), listedeki herhangi bir öğenin unicode varsa str kullanmanın bir istisna doğuracağını unutmayın.
kroiz

75

Neden map/ lambdabüyü? Bu çalışmıyor mu?

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

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

Listede numaralar olması durumunda, liste kavrama özelliğini kullanabilirsiniz:

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

veya bir jeneratör ifadesi:

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

18

",".join(l)tüm durumlar için çalışmaz. StringIO ile csv modülünü kullanmanızı öneririm

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'te hayır
Ron Kalian

4
@RonKalian from io import StringIOPython 3'te Kullanım
Kevin Ashcraft

13

Python 3.0'da dize olmayan liste öğelerine izin veren alternatif bir çözüm:

>>> alist = ['a', 1, (2, 'b')]
  • standart bir yol

    >>> ", ".join(map(str, alist))
    "a, 1, (2, 'b')"
  • alternatif çözüm

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

NOT: Virgülden sonraki boşluk kasıtlıdır.



10

@ErkekTerimleri

Jeneratör ifadelerinin kullanılması da bir yineleyici üretmenin yararına sahiptir, ancak itertools'un içe aktarılmasını azaltır. Ayrıca, liste kavramaları genellikle harita için tercih edilir, bu nedenle jeneratör ifadelerinin imap için tercih edilmesini beklerdim.

>>> 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_listherhangi bir değişken türü içerebilir. Bu sonuçtan kaçının 'A,,,D,E'.


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

print str(l)[1:-1]

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

1
Bu sayfadaki diğer çözümlerin aksine, dizeleri de alıntıladığınızı belirtmeniz gerektiğini düşünüyorum.
mrdevlar

3

@ jmanning2k bir liste anlama kullanarak yeni bir geçici liste oluşturma dezavantajına sahiptir. Daha iyi bir çözüm, bir yineleyici döndüren itertools.imap kullanmak olacaktır

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

Bu çözüm, boş dize için fazladan virgül eklememe ve NoneType ile 'Yok' eklememe gereksinimlerini karşılamaz.
Roberto

kontrol str.join daha hızlı olan işi listjeneratör ile karşılaştırıldığında
Grijesh Chauhan

3

İşte listeli bir örnek

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

Daha kesin:-

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

Örnek 2: -

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

1
Bu soru, listeler hakkında değil listeler hakkındaydı .
Eero Aaltonen

@EeroAaltonen Cevabımı güncelledim, beni sağa işaret ettiğiniz için teşekkürler.

1

csvDize virgül gibi tüm csv kullanım durumları ile başa çıkmak için inşa edilmiş gibi kütüphane burada tek mantıklı seçenek olduğunu söyleyebilirim .

Bir listeyi l.csv dosyasına çıkarmak için:

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)Birden çok satırı csv'ye çıktılamak için de kullanılabilir .

Bu örnek Python 3 ile uyumludur, burada kullanılan diğer cevap StringIOPython 2'dir.


Ama bu diğer cevaplara kıyasla çok fazla / karmaşık değil mi?
Sreenikethan I

0

Bir şey kaçırmadıkça, istediğini ','.join(foo)yapmalısın.

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

(değiştir: ve jmanning2k'nin işaret ettiği gibi,

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

daha güvenli ve oldukça Pythonic'tir, ancak öğeler virgül içerebiliyorsa ortaya çıkan dizeyi ayrıştırmak zor olacaktır - bu noktada, csvDouglas'ın cevabında belirttiği gibi modülün tam gücüne ihtiyacınız vardır .)


-2

Benim görüşüm. Ben daha basit bir tek satırlık python gibi:

>>> 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, dizeler, sayılar, Hiçbiri ve boş dize için çalışır. Kısa ve gereksinimleri karşılar. Liste sayı içermiyorsa, bu daha basit varyasyonu kullanabiliriz:

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

Ayrıca bu çözüm yeni bir liste oluşturmaz, ancak @Peter Hoffmann'ın işaret ettiği gibi bir yineleyici kullanır (teşekkürler).


Bu gereksiz. Kabul edilen cevap basit, doğrudan ve açıkça en iyi çözümdür. Aşırı karmaşık alternatifler sağlamak anlamsız bir zaman kaybıdır. Zaten geçerli bir cevap olduğunda sadece dilin diğer özellikleri hakkında eğitim vermeye çalışıyorsanız, beni reddettiğinizle aynı şeyi yapıyorsunuz.
clearlight
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.