Como imprimir uma lista “corretamente”?


95

Então, eu tenho uma lista:

['x', 3, 'b']

E eu quero que o resultado seja:

[x, 3, b]

Como posso fazer isso em python?

Se eu fizer isso str(['x', 3, 'b']), recebo um com aspas, mas não quero aspas.


Para explicar por que a lista não é impressa "apropriadamente", print(["Sam"])chama repr("Sam"), que retorna 'Sam'(com as aspas), ao contrário de quando você chama print("Sam")e chama python str("Sam")que retorna Sam(sem as aspas). Ver diferença entre strerepr ou Python stre lists para mais informações.
Anônimo

Respostas:


188

Em Python 2:

mylist = ['x', 3, 'b']
print '[%s]' % ', '.join(map(str, mylist))

No Python 3 (onde printé uma função embutida e não um recurso de sintaxe mais):

mylist = ['x', 3, 'b']
print('[%s]' % ', '.join(map(str, mylist)))

Ambos retornam:

[x, 3, b]

Isso usa a map()função de chamar str para cada elemento de mylist , criando uma nova lista de strings que é então unida em uma string com str.join(). Em seguida, o %operador de formatação de string substitui a string em em vez de %sem "[%s]".


4
Obrigado, isso funciona muito bem. Você pode explicar um pouco em detalhes o que você está fazendo na segunda linha? Eu sou novo em python.
Obaid

19
Ele está usando a mapfunção para chamar strcada elemento de mylist, criando uma nova lista de strings que ele então une em uma string str.join. Em seguida, ele usa o %operador de formatação de string para substituir a string em em vez de %sem "[%s]".
li.davidm

6
Outra maneira de fazer isso talvez seja um pouco mais moderna: "[{0}]".format(", ".join(str(i) for i in mylist))
Jack O'Connor

2
eu tendo a preferir map(f, xs)(ou imapem python2.x) sobre (f(x) for x in xs), quando fé um chamável predefinido; que tende a executar menos bytecodes e geralmente é mais compacto. Certamente não map(lambda x:..., xs) isso é muito pior do que(... for x in xs)
SingleNegationElimination

1
@ user1767754: sério? Ligação?
SingleNegationElimination

18

Este é um código simples, portanto, se você for novo, deve entendê-lo com bastante facilidade.

    mylist = ["x", 3, "b"]
    for items in mylist:
        print(items)

Imprime todos sem aspas, como você desejava.


15

Usando apenas impressão:

>>> l = ['x', 3, 'b']
>>> print(*l, sep='\n')
x
3
b
>>> print(*l, sep=', ')
x, 3, b


9

Em vez de usar map, eu recomendo usar uma expressão geradora com a capacidade de joinaceitar um iterador:

def get_nice_string(list_or_iterator):
    return "[" + ", ".join( str(x) for x in list_or_iterator) + "]"

Aqui, joinestá uma função-membro da classe string str. Recebe um argumento: uma lista (ou iterador) de strings e retorna uma nova string com todos os elementos concatenados por, neste caso ,,.


2
Uma boa otimização para Python 2, uma vez que map retorna uma lista em 2.x. Ele retorna um gerador em 3.x, então não ajuda muito nisso.
Tom Zych

7
Eu voltaria", ".join( str(x) for x in list_or_iterator).join('[]')
eyquem

@eyquem: Inteligente, nunca vi o join ser usado assim antes. Ainda assim, isso é um pouco mais opaco para um iniciante (já que você está usando a propriedade de que uma string é um contêiner iterável de strings de um caractere).
Seth Johnson

6

Você pode excluir todos os caracteres indesejados de uma string usando seu translate()método com Nonepara o tableargumento seguido por uma string contendo o (s) caractere (s) que você deseja remover de seu deletecharsargumento.

lst = ['x', 3, 'b']

print str(lst).translate(None, "'")

# [x, 3, b]

Se estiver usando uma versão do Python anterior à 2.6, você precisará usar a função stringdo módulo, translate()porque a capacidade de passar Nonecomo o tableargumento não foi adicionada até o Python 2.6. Usando a aparência:

import string

print string.translate(str(lst), None, "'")

Usar a string.translate()função também funcionará no 2.6+, portanto, pode ser preferível usá-la.


2
Infelizmente: lst = ["it isn't", 3, 'b']==> ["it isnt", 3, b]e também comlst = ['it isn\'t', 3, 'b']
eyquem

1
@eyquem: Sim, evitar a exclusão de caracteres que realmente fazem parte de seus dados (em vez de serem estritamente usados ​​para delimitá-los) naturalmente exigiria uma lógica um pouco mais elaborada / diferente se for uma possibilidade.
martineau

3

Aqui está uma sessão interativa que mostra alguns dos passos do one-liner do @ TokenMacGuy. Primeiro, ele usa a mapfunção para converter cada item da lista em uma string (na verdade, ele está fazendo uma nova lista, não convertendo os itens da lista antiga). Então ele está usando o método string joinpara combinar essas strings com', ' entre elas. O resto é apenas formatação de string, que é bastante simples. (Editar: esta instância é direta; a formatação de strings em geral pode ser um tanto complexa.)

Observe que usar joiné uma maneira simples e eficiente de construir uma string a partir de várias substrings, muito mais eficiente do que fazê-lo adicionando strings sucessivamente a strings, o que envolve muitas cópias nos bastidores.

>>> mylist = ['x', 3, 'b']
>>> m = map(str, mylist)
>>> m
['x', '3', 'b']
>>> j = ', '.join(m)
>>> j
'x, 3, b'

2

Usando .formatpara formatação de string,

mylist = ['x', 3, 'b']
print("[{0}]".format(', '.join(map(str, mylist))))

Resultado:

[x, 3, b]

Explicação:

  1. mapé usado para mapear cada elemento da lista para stringdigitar.
  2. Os elementos são unidos em uma string com um ,separador.
  3. Usamos [e ]na instrução print para mostrar as chaves da lista.

Referência: .formatpara formatação de string PEP-3101


Ótimo! Acho que usar .formata forma mais python. Mas, é claro, aceito divergências. ;)
amou.por.Jesus

0

Fui inspirado por @AniMenon para escrever uma solução pythônica mais geral.

mylist = ['x', 3, 'b']
print('[{}]'.format(', '.join(map('{}'.format, mylist))))

Ele apenas usa o formatmétodo. Sem vestígios de str, e permite o ajuste fino do formato dos elementos. Por exemplo, se você tiver números flutuantes como elementos da lista, você pode ajustar seu formato, adicionando um especificador de conversão, neste caso:.2f

mylist = [1.8493849, -6.329323, 4000.21222111]
print("[{}]".format(', '.join(map('{:.2f}'.format, mylist))))

O resultado é bastante decente:

[1.85, -6.33, 4000.21]
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.