Hvordan ville du gjøre en kommaseparert streng fra en liste over strenger?

stemmer
333

Hva ville være din foretrukne måten å sette sammen strenger fra en sekvens slik at mellom hvert to påfølgende par komma er lagt til. Det er, hvordan du kart gjør, for eksempel, [ 'a', 'b', 'c' ]å 'a,b,c'? (Tilfellene [ s ]og []kartlegges til sog '', henholdsvis).

Jeg pleier å ende opp med noe sånt ''.join(map(lambda x: x+',',l))[:-1], men også følelsen litt misfornøyd.

Edit: Jeg er både skamfull og glad for at løsningen er så enkel. Tydeligvis har jeg knapt en anelse om hva jeg gjør. (Jeg trengte nok enkel sammensetning i det siste og noe lagret s.join([e1,e2,...])som en forkortelse for s+e1+e2+....)

Publisert på 04/09/2008 klokken 21:04
kilden bruker
På andre språk...                            


15 svar

stemmer
637

myList = ['a','b','c','d']
myString = ",".join(myList )

Dette vil ikke fungere hvis listen inneholder tall.


Som Ricardo Reyes foreslått, hvis det inneholder ikke-strengtypene (som heltall, flyter, bools, Ingen) og deretter gjøre:

myList = ','.join(map(str, myList)) 
Svarte 04/09/2008 kl. 21:06
kilden bruker

stemmer
59

Hvorfor kartet / lambda magi? Betyr ikke dette fungere?

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

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

Edit: @ mark-biek påpeker tilfelle for tall. Kanskje listen forståelse:

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

er mer "Pytonske".

Edit2: Takk for forslagene. Jeg skal bruke generatoren i stedet for en liste forståelse i fremtiden.

>>>','.join(str(x) for x in foo)
Svarte 04/09/2008 kl. 21:08
kilden bruker

stemmer
11

",".join(l)vil ikke fungere for alle tilfeller. Jeg vil foreslå å bruke csv-modul med 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'
Svarte 10/02/2016 kl. 15:43
kilden bruker

stemmer
11

Her er en alternativ løsning i Python 3.0 som gjør at ikke-streng listeelementer:

>>> alist = ['a', 1, (2, 'b')]
  • en standard måte

    >>> ", ".join(map(str, alist))
    "a, 1, (2, 'b')"
    
  • den alternative løsningen

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

MERK: mellomrom etter komma er tilsiktet.

Svarte 01/10/2008 kl. 09:23
kilden bruker

stemmer
11

@Peter Hoffmann

Ved hjelp av generatorer uttrykk har fordelen av også å produsere en iterator men sparer importerer itertools. Videre er liste oppfattelser generelt foretrukket å kartlegge, og dermed ville jeg forvente generator uttrykk for å bli foretrukket til imap.

>>> l = [1, "foo", 4 ,"bar"]
>>> ",".join(str(bit) for bit in l)
'1,foo,4,bar' 
Svarte 05/09/2008 kl. 16:29
kilden bruker

stemmer
11

Tror ikke du bare vil:

",".join(l)

Tydeligvis det blir mer komplisert hvis du trenger å sitere / rømme komma etc i verdiene. I så fall ville jeg foreslå å se på csv-modulen i standard bibliotek:

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

Svarte 04/09/2008 kl. 21:09
kilden bruker

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

my_listkan inneholde hvilken som helst type av variable. Dette unngår resultatet 'A,,,D,E'.

Svarte 20/05/2017 kl. 11:31
kilden bruker

stemmer
4

@ Jmanning2k ved hjelp av en liste forståelse har den ulempen av å opprette en ny midlertidig liste. Jo bedre løsning ville være å bruke itertools.imap som returnerer en iterator

from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join(imap(str, l))
Svarte 04/09/2008 kl. 21:57
kilden bruker

stemmer
3

for omdannelse av liste som inneholder tallene følgende:

string  =  ''.join([str(i) for i in list])
Svarte 06/09/2012 kl. 10:08
kilden bruker

stemmer
3
l=['a', 1, 'b', 2]

print str(l)[1:-1]

Output: "'a', 1, 'b', 2"
Svarte 15/09/2008 kl. 18:08
kilden bruker

stemmer
1

Her er et eksempel med liste

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

Mer nøyaktig:-

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

Eksempel 2: -

myList = ['Apple','Orange']
myList = ','.join(map(str, myList)) 
print "Output:", myList
Output: Apple,Orange
Svarte 15/05/2017 kl. 11:25
kilden bruker

stemmer
1

Med mindre jeg mangler noe, ','.join(foo)bør gjøre det du ber om.

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

(Edit: og som jmanning2k påpeker,

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

er tryggere og ganske Pytonske, men den resulterende strengen vil være vanskelig å analysere om elementene kan inneholde komma - på det punktet, trenger du full effekt av den csv. modul, som Douglas påpeker i sitt svar)

Svarte 04/09/2008 kl. 21:10
kilden bruker

stemmer
0

Jeg vil si at csvbiblioteket er det eneste fornuftige alternativet her, som det ble bygget for å takle alle csv brukstilfeller som komma i en streng, etc.

Å sende ut en liste ltil en CSV-fil:

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.  

Det er også mulig å bruke writer.writerows(iterable)til å sende ut flere rader for å csv.

Dette eksempelet er kompatibel med Python 3, som den andre svaret her brukt StringIOsom Python to.

Svarte 18/06/2018 kl. 15:08
kilden bruker

stemmer
-1

bare litt noe sånt som dette :)

String = "Once:Upon:a:Time:A:Long:Time:Ago"
ding = String.split(':')

ring = (" , ").join(ding)

print(ring)

Utgang: En gang, på, en, Time, A, Long, Time, Ago

Svarte 24/04/2018 kl. 08:17
kilden bruker

stemmer
-2

Mine to cent. Jeg liker enklere en én linje kode i 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'

Det er Pytonske, fungerer for strenger, tall, Ingen og tom streng. Det er kort og tilfredsstiller kravene. Hvis listen ikke kommer til å inneholde tall, kan vi bruke dette enklere variant:

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

Også denne løsningen ikke opprette en ny liste, men bruker en iterator, som @Peter Hoffmann pekte (takk).

Svarte 07/01/2018 kl. 13:56
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more