What would be your preferred way to concatenate strings from a sequence such that between every two consecutive pairs a comma is added. That is, how do you map, for instance, ['a', 'b', 'c']
to 'a,b,c'
? [The cases ['s']
and []
should be mapped to 's'
and ''
, respectively.]
I usually end up using
something like ''.join[map[lambda x: x+',',l]][:-1]
, but also feeling somewhat unsatisfied.
Georgy
10.7k7 gold badges62 silver badges68 bronze badges
asked Sep 4, 2008 at 21:04
1
my_list = ['a', 'b', 'c', 'd']
my_string = ','.join[my_list]
'a,b,c,d'
This won't work if the list contains integers
And if the list contains non-string types [such as integers, floats, bools, None] then do:
my_string = ','.join[map[str, my_list]]
answered Sep 4, 2008 at 21:06
Mark BiekMark Biek
143k54 gold badges155 silver badges200 bronze badges
4
Why the map
/lambda
magic? Doesn't this work?
>>> foo = ['a', 'b', 'c']
>>> print[','.join[foo]]
a,b,c
>>> print[','.join[[]]]
>>> print[','.join[['a']]]
a
In case if there are numbers in the list, you could use list comprehension:
>>> ','.join[[str[x] for x in foo]]
or a generator expression:
>>> ','.join[str[x] for x in foo]
Georgy
10.7k7 gold badges62 silver badges68 bronze badges
answered Sep 4, 2008 at 21:08
jmanning2kjmanning2k
9,0694 gold badges30 silver badges23 bronze badges
0
",".join[l]
will not work for all cases. I'd suggest using the csv module with 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'
answered Feb 10, 2016 at 15:43
Ricky SahuRicky Sahu
22.1k4 gold badges39 silver badges31 bronze badges
2
@Peter Hoffmann
Using generator expressions has the benefit of also producing an iterator but saves importing itertools. Furthermore, list comprehensions are generally preferred to map, thus, I'd expect generator expressions to be preferred to imap.
>>> l = [1, "foo", 4 ,"bar"]
>>> ",".join[str[bit] for bit in l]
'1,foo,4,bar'
answered Sep 5, 2008 at 16:29
Aaron MaenpaaAaron Maenpaa
115k10 gold badges94 silver badges108 bronze badges
1
Here is a alternative solution in Python 3.0 which allows non-string list items:
>>> alist = ['a', 1, [2, 'b']]
a standard way
>>> ", ".join[map[str, alist]] "a, 1, [2, 'b']"
the alternative solution
>>> import io >>> s = io.StringIO[] >>> print[*alist, file=s, sep=', ', end=''] >>> s.getvalue[] "a, 1, [2, 'b']"
NOTE: The space after comma is intentional.
answered Oct 1, 2008 at 9:23
jfsjfs
381k179 gold badges943 silver badges1611 bronze badges
Don't you just want:
",".join[l]
Obviously it gets more complicated if you need to quote/escape commas etc in the values. In that case I would suggest looking at the csv module in the standard library:
//docs.python.org/library/csv.html
twasbrillig
15.3k9 gold badges40 silver badges62 bronze badges
answered Sep 4, 2008 at 21:09
Douglas LeederDouglas Leeder
51k9 gold badges91 silver badges136 bronze badges
>>> my_list = ['A', '', '', 'D', 'E',]
>>> ",".join[[str[i] for i in my_list if i]]
'A,D,E'
my_list
may contain any type of variables. This avoid the result 'A,,,D,E'
.
answered May 20, 2017 at 11:31
ShameemShameem
2,44416 silver badges20 bronze badges
l=['a', 1, 'b', 2]
print str[l][1:-1]
Output: "'a', 1, 'b', 2"
AlvaroAV
9,84710 gold badges56 silver badges88 bronze badges
answered Sep 15, 2008 at 18:08
1
@jmanning2k using a list comprehension has the downside of creating a new temporary list. The better solution would be using itertools.imap which returns an iterator
from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join[imap[str, l]]
answered Sep 4, 2008 at 21:57
Peter HoffmannPeter Hoffmann
53.8k15 gold badges74 silver badges58 bronze badges
2
Here is an example with list
>>> myList = [['Apple'],['Orange']]
>>> myList = ','.join[map[str, [i[0] for i in myList]]]
>>> print "Output:", myList
Output: Apple,Orange
More Accurate:-
>>> myList = [['Apple'],['Orange']]
>>> myList = ','.join[map[str, [type[i] == list and i[0] for i in myList]]]
>>> print "Output:", myList
Output: Apple,Orange
Example 2:-
myList = ['Apple','Orange']
myList = ','.join[map[str, myList]]
print "Output:", myList
Output: Apple,Orange
answered May 15, 2017 at 11:25
2
If you want to do the shortcut way :] :
','.join[[str[word] for word in wordList]]
But if you want to show off with logic :] :
wordList = ['USD', 'EUR', 'JPY', 'NZD', 'CHF', 'CAD']
stringText = ''
for word in wordList:
stringText += word + ','
stringText = stringText[:-2] # get rid of last comma
print[stringText]
answered Jun 26, 2020 at 16:53
faiz-efaiz-e
1823 silver badges21 bronze badges
Unless I'm missing something, ','.join[foo]
should do what you're asking for.
>>> ','.join[['']]
''
>>> ','.join[['s']]
's'
>>> ','.join[['a','b','c']]
'a,b,c'
[edit: and as jmanning2k points out,
','.join[[str[x] for x in foo]]
is safer and quite Pythonic, though the resulting string will be difficult to parse if the elements can contain commas -- at that point, you need the full power of the csv
module, as Douglas points out in his answer.]
answered Sep 4, 2008 at 21:10
David SingerDavid Singer
1,1621 gold badge10 silver badges11 bronze badges
I would say the csv
library is the only sensible option
here, as it was built to cope with all csv use cases such as commas in a string, etc.
To output a list l
to a .csv file:
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.
It is also possible to use writer.writerows[iterable]
to output multiple rows to csv.
This example is compatible with Python 3, as the other answer here used StringIO
which is Python 2.
answered Jun 18, 2018 at 15:08
Ron KalianRon Kalian
2,9442 gold badges14 silver badges22 bronze badges
1
mmm also need for SQL is :
l = ["foo" , "baar" , 6]
where_clause = "..... IN ["+[','.join[[ f"'{x}'" for x in l]]]+"]"
>> "..... IN ['foo','baar','6']"
enjoit
answered Nov 26, 2021 at 14:44
My two cents. I like simpler an one-line code in 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'
It's pythonic, works for strings, numbers, None and empty string. It's short and satisfies the requirements. If the list is not going to contain numbers, we can use this simpler variation:
>>> ','.join[ifilter[lambda x: x, l]]
Also this solution doesn't create a new list, but uses an iterator, like @Peter Hoffmann pointed [thanks].
answered Jan 7, 2018 at 13:56
RobertoRoberto
3746 silver badges9 bronze badges
1