Como você fazer uma seqüência separada por vírgula em uma lista de cordas?

votos
313

O que seria a sua forma preferida a concatenar cadeias a partir de uma sequência de tal modo que entre cada dois par consecutivo uma vírgula é adicionado. Isto é, como você mapear, por exemplo, [ 'a', 'b', 'c' ]para 'a,b,c'? (Os casos [ s ]e []deve ser mapeado para se '', respectivamente).

Eu geralmente acabam usando algo parecido ''.join(map(lambda x: x+',',l))[:-1], mas também sentindo um pouco insatisfeito.

Edit: Eu sou tanto envergonhado e feliz que a solução é tão simples. Obviamente, eu tenho praticamente uma pista sobre o que estou fazendo. (Eu provavelmente necessária concatenação simples no passado e de alguma forma memorizada s.join([e1,e2,...])como uma abreviação para s+e1+e2+....)

Publicado 04/09/2008 em 22:04
fonte usuário
Em outras línguas...                            


15 respostas

votos
593

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

Isso não vai funcionar se a lista contém números.


Como Ricardo Reyes sugerido, se contiver tipos não-string (como números inteiros, carros alegóricos, bools, Nenhum), em seguida, fazer:

myList = ','.join(map(str, myList)) 
Respondeu 04/09/2008 em 22:06
fonte usuário

votos
58

Por que a magia mapa / lambda? Isso não funciona?

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

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

Edit: @ pontos mark-BIEK fora o caso de números. Talvez a compreensão da lista:

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

é mais "pythônico".

Edit2: Obrigado pelas sugestões. Vou usar o gerador em vez da compreensão de lista no futuro.

>>>','.join(str(x) for x in foo)
Respondeu 04/09/2008 em 22:08
fonte usuário

votos
11

Não basta você quer:

",".join(l)

Obviamente, ele fica mais complicado se você precisa citar / escapar vírgulas etc nos valores. Nesse caso, eu gostaria de sugerir a olhar para o módulo de csv da biblioteca padrão:

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

Respondeu 04/09/2008 em 22:09
fonte usuário

votos
10

Aqui está uma solução alternativa em Python 3.0, que permite que os itens da lista não-string:

>>> alist = ['a', 1, (2, 'b')]
  • uma forma padrão

    >>> ", ".join(map(str, alist))
    "a, 1, (2, 'b')"
    
  • a solução alternativa

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

NOTA: O espaço após a vírgula é intencional.

Respondeu 01/10/2008 em 10:23
fonte usuário

votos
9

",".join(l)não vai funcionar para todos os casos. Eu sugiro usar o módulo de csv com 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'
Respondeu 10/02/2016 em 15:43
fonte usuário

votos
9

@ Peter Hoffmann

Usando expressões gerador tem a vantagem de produzir também um iterador, mas poupa itertools importadores. Além disso, compreensões lista são geralmente preferidos para mapear, assim, eu esperaria gerador de expressões para ser preferido para imap.

>>> l = [1, "foo", 4 ,"bar"]
>>> ",".join(str(bit) for bit in l)
'1,foo,4,bar' 
Respondeu 05/09/2008 em 17:29
fonte usuário

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

my_listpodem conter qualquer tipo de variáveis. Este evitar o resultado 'A,,,D,E'.

Respondeu 20/05/2017 em 11:31
fonte usuário

votos
4

@ Jmanning2k usando uma compreensão da lista tem a desvantagem de criar uma nova lista temporária. A melhor solução seria usar itertools.imap que retorna um iterador

from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join(imap(str, l))
Respondeu 04/09/2008 em 22:57
fonte usuário

votos
3

para uma lista contendo os números converter faça o seguinte:

string  =  ''.join([str(i) for i in list])
Respondeu 06/09/2012 em 11:08
fonte usuário

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

print str(l)[1:-1]

Output: "'a', 1, 'b', 2"
Respondeu 15/09/2008 em 19:08
fonte usuário

votos
1

A menos que eu estou faltando alguma coisa, ','.join(foo)deve fazer o que você está pedindo.

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

(Edit: e como jmanning2k aponta,

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

é mais seguro e bastante Pythonic, embora a cadeia resultante será difícil analisar se os elementos podem conter vírgulas - nesse ponto, você precisa o poder do csv. módulo, como Douglas aponta em sua resposta)

Respondeu 04/09/2008 em 22:10
fonte usuário

votos
0

Eu diria que a csvbiblioteca é a única opção sensata aqui, como foi construído para lidar com todos os casos de uso CSV, como vírgulas em uma corda, etc.

Para emitir uma lista lpara um arquivo .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.  

Também é possível usar writer.writerows(iterable)a saída de várias linhas para CSV.

Este exemplo é compatível com o Python 3, como a outra resposta aqui usado StringIO, que é o Python 2.

Respondeu 18/06/2018 em 15:08
fonte usuário

votos
0

Aqui está um exemplo com a lista

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

Mais preciso:-

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

Exemplo 2: -

myList = ['Apple','Orange']
myList = ','.join(map(str, myList)) 
print "Output:", myList
Output: Apple,Orange
Respondeu 15/05/2017 em 11:25
fonte usuário

votos
-1

apenas um pouco algo como isto :)

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

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

print(ring)

Saída: Uma vez que, em cima,, Time, um A, Long, tempo, há

Respondeu 24/04/2018 em 08:17
fonte usuário

votos
-2

Meus dois centavos. Eu gosto mais simples de um código de uma linha em 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'

É pythônico, funciona para strings, números, Nenhum e string vazia. É curto e satisfaz os requisitos. Se a lista não vai conter números, podemos usar esta variação mais simples:

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

Também esta solução não criar uma nova lista, mas usa um iterador, como @ Peter Hoffmann apontou (graças).

Respondeu 07/01/2018 em 13:56
fonte usuário

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