Comment voulez-vous faire une chaîne séparée par des virgules à partir d'une liste de chaînes de caractères?

StackOverflow https://stackoverflow.com/questions/44778

  •  09-06-2019
  •  | 
  •  

Question

Quel serait votre moyen préféré pour concaténer des chaînes à partir d'une séquence telle que entre chaque deux années consécutives paire une virgule est ajoutée.C'est, comment voulez-vous carte, par exemple, [ 'a', 'b', 'c' ] pour 'a,b,c'?(Le cas [ s ] et [] doit être mappé s et '', respectivement.)

Je finissent généralement en utilisant quelque chose comme ''.join(map(lambda x: x+',',l))[:-1], mais aussi se sentir un peu sur ma faim.

Edit:Je suis à la fois honte et heureux que la solution est si simple.Évidemment, je n'ai presque pas la moindre idée de ce que je fais.(J'ai probablement besoin d'une "simple" concaténation dans le passé et d'une certaine façon de mémoriser s.join([e1,e2,...]) comme une abréviation pour s+e1+e2+....)

Était-ce utile?

La solution

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

Cela ne fonctionnera pas si la liste contient les numéros de téléphone.


Comme Ricardo Reyes suggéré, si elle contient des types de chaînes (tels que les entiers, les chars, les booléens, Aucun) alors:

myList = ','.join(map(str, myList)) 

Autres conseils

Pourquoi la carte/lambda de la magie?N'est-ce pas le travail?

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

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

Edit:@marc-biek souligne le cas pour les nombres.Peut-être la compréhension de liste:

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

c'est plus "pythonic".

Edit2:Merci pour les suggestions.Je vais utiliser le générateur plutôt que de la compréhension de liste dans l'avenir.

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

",".join(l) ne fonctionne pas pour tous les cas.Je vous conseille d'utiliser le module csv avec 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'

Voici une solution alternative en Python 3.0, ce qui permet de chaîne non les éléments de la liste:

>>> alist = ['a', 1, (2, 'b')]
  • une façon standard

    >>> ", ".join(map(str, alist))
    "a, 1, (2, 'b')"
    
  • la solution de rechange

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

NOTE:L'espace après la virgule est intentionnelle.

@Peter Hoffmann

À l'aide du générateur d'expressions, qui a l'avantage de la production d'un itérateur, mais permet d'économiser de l'importation de itertools.En outre, les interprétations de la liste sont généralement préférés à la carte, et donc, je m'attends à de générateur d'expressions à privilégier pour imap.

>>> l = [1, "foo", 4 ,"bar"]
>>> ",".join(str(bit) for bit in l)
'1,foo,4,bar' 

Ne vous souhaitez:

",".join(l)

Évidemment, cela devient plus compliqué si vous avez besoin de les citer/échapper à la virgule etc dans les valeurs.Dans ce cas, je vous suggère de regarder à l'csv module de la bibliothèque standard:

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

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

my_list peut contenir n'importe quel type de variables.Cela évite le résultat 'A,,,D,E'.

@jmanning2k à l'aide d'une compréhension de liste a l'inconvénient de créer une nouvelle liste temporaire.La meilleure solution serait d'utiliser itertools.imap qui renvoie un itérateur

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

pour la conversion de la liste contenant les numéros d'effectuer les opérations suivantes:

string  =  ''.join([str(i) for i in list])
l=['a', 1, 'b', 2]

print str(l)[1:-1]

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

À moins que je me manque quelque chose, ','.join(foo) faire ce que vous demandez.

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

(edit:et comme jmanning2k souligne,

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

est plus sûr et assez Pythonic, bien que la chaîne résultante sera difficile d'analyser si les éléments peuvent contenir des virgules -- à ce point, vous avez besoin de la pleine puissance de la csv module, comme Douglas souligne dans sa réponse.)

Voici un exemple avec la liste

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

Plus Précis:-

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

Exemple 2:-

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

Je dirais que l' csv la bibliothèque est la seule option raisonnable ici, comme il a été construit pour faire face à toutes les csv cas d'utilisation tels que les virgules dans une chaîne de caractères, etc.

Générer la liste l à un .fichier 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.  

Il est également possible d'utiliser writer.writerows(iterable) à la sortie de plusieurs lignes dans un fichier csv.

Cet exemple est compatible avec Python 3, comme l'autre réponse ici StringIO qui est Python 2.

juste un petit quelque chose de ce genre :)

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

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

print(ring)

Sortie:Une fois , Sur , une , Fois , Une , très Longtemps , il Y a

Mes deux cents.J'aime plus simple d'une seule ligne de code en 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'

C'est pythonic, travaille pour les chaînes de caractères, nombres, Aucun et chaîne vide.C'est court, et satisfait aux exigences.Si la liste ne va pas contenir des chiffres, on ne peut plus simple variation:

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

Aussi cette solution n'est pas de créer une nouvelle liste, mais utilise un itérateur, comme @Peter Hoffmann signalé (merci).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top