Comment imprimer «correctement» une liste?

95

J'ai donc une liste:

['x', 3, 'b']

Et je veux que la sortie soit:

[x, 3, b]

Comment puis-je faire cela en python?

Si je le fais str(['x', 3, 'b']), j'en reçois une avec des citations, mais je ne veux pas de citations.

Obaid
la source
Pour expliquer pourquoi la liste n'est pas "correctement" imprimée, print(["Sam"])appelle repr("Sam"), qui retourne 'Sam'(avec les guillemets), contrairement à quand vous appelez print("Sam")et python appelle str("Sam")qui retourne Sam(sans les guillemets). Voir la différence entre stretrepr ou Python stret lists pour plus d'informations.
Anonyme

Réponses:

188

Dans Python 2:

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

En Python 3 (où printest une fonction intégrée et non plus une fonction de syntaxe):

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

Les deux reviennent:

[x, 3, b]

Cela utilise la map()fonction pour appeler str pour chaque élément de mylist , créant une nouvelle liste de chaînes qui est ensuite jointe en une chaîne avec str.join(). Ensuite, l' %opérateur de mise en forme de chaîne remplace la chaîne par au lieu de %sin "[%s]".

SingleNegationElimination
la source
4
Merci qui fonctionne très bien. Pouvez-vous expliquer un peu en détail ce que vous faites dans la deuxième ligne? Je suis nouveau sur python.
Obaid
19
Il utilise la mapfonction à appeler strpour chaque élément de mylist, créant une nouvelle liste de chaînes qu'il joint ensuite en une chaîne avec str.join. Ensuite, il utilise l' %opérateur de mise en forme de chaîne pour remplacer la chaîne dans au lieu de %sin "[%s]".
li.davidm
6
Une autre façon de faire qui est peut-être un peu plus moderne: "[{0}]".format(", ".join(str(i) for i in mylist))
Jack O'Connor
2
j'ai tendance à préférer map(f, xs)(ou imapen python2.x) à (f(x) for x in xs), quand fest un appelable prédéfini; qui a tendance à exécuter moins de bytecodes et est généralement plus compact. Certainement pas map(lambda x:..., xs) c'est bien pire que(... for x in xs)
SingleNegationElimination
1
@ user1767754: vraiment? Lien?
SingleNegationElimination
18

C'est un code simple, donc si vous êtes nouveau, vous devriez le comprendre assez facilement.

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

Il les imprime tous sans guillemets, comme vous le vouliez.

reemer9997
la source
15

En utilisant uniquement l'impression:

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

Si vous utilisez Python3:

print('[',end='');print(*L, sep=', ', end='');print(']')
Kabie
la source
1
que fait print (* L) ici?
sandeeps
1
Je suis confus par cela. Le type de données long filtre-t-il la liste d'une manière ou d'une autre?
dval
Une version plus concise seraitprint(end='['); print(*l, sep=', ', end=']\n')
Anonyme
9

Au lieu d'utiliser map, je recommanderais d'utiliser une expression de générateur avec la capacité d' joinaccepter un itérateur:

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

Voici joinune fonction membre de la classe string str. Il prend un argument: une liste (ou itérateur) de chaînes, puis retourne une nouvelle chaîne avec tous les éléments concaténés par, dans ce cas ,,.

Seth Johnson
la source
2
Une bonne optimisation pour Python 2, puisque map renvoie une liste en 2.x. Il renvoie un générateur dans 3.x, donc cela n'aide pas autant là-bas.
Tom Zych
7
Je reviendrais", ".join( str(x) for x in list_or_iterator).join('[]')
eyquem
@eyquem: Intelligent, je n'ai jamais vu de jointure utilisée comme ça auparavant. Pourtant, c'est un peu plus opaque pour un débutant (puisque vous utilisez la propriété qu'une chaîne est un conteneur itérable de chaînes à un caractère).
Seth Johnson
6

Vous pouvez supprimer tous les caractères indésirables d'une chaîne en utilisant sa translate()méthode avec Nonepour l' tableargument suivi d'une chaîne contenant le (s) caractère (s) que vous souhaitez supprimer pour son deletecharsargument.

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

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

# [x, 3, b]

Si vous utilisez une version de Python antérieure à la 2.6, vous devrez utiliser la fonction stringdu module à la translate()place car la possibilité de passer en Nonetant tablequ'argument n'a été ajoutée qu'à partir de Python 2.6. Son utilisation ressemble à ceci:

import string

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

L'utilisation de la string.translate()fonction fonctionnera également dans 2.6+, donc son utilisation pourrait être préférable.

Martineau
la source
2
Hélas: lst = ["it isn't", 3, 'b']==> ["it isnt", 3, b]et aussi aveclst = ['it isn\'t', 3, 'b']
eyquem
1
@eyquem: Oui, éviter la suppression de caractères qui font réellement partie de vos données (plutôt que d'être strictement utilisés pour les délimiter) nécessiterait naturellement une logique légèrement plus élaborée / différente si c'est une possibilité.
martineau
3

Voici une session interactive montrant certaines des étapes du one-liner de @ TokenMacGuy. Il utilise d'abord la mapfonction pour convertir chaque élément de la liste en une chaîne (en fait, il crée une nouvelle liste, ne convertit pas les éléments de l'ancienne liste). Ensuite, il utilise la méthode string joinpour combiner ces chaînes avec', ' entre elles. Le reste n'est que du formatage de chaîne, ce qui est assez simple. (Modifier: cette instance est simple; le formatage des chaînes en général peut être quelque peu complexe.)

Notez que l'utilisation joinest un moyen simple et efficace de créer une chaîne à partir de plusieurs sous-chaînes, beaucoup plus efficace que de le faire en ajoutant successivement des chaînes aux chaînes, ce qui implique beaucoup de copie en arrière-plan.

>>> mylist = ['x', 3, 'b']
>>> m = map(str, mylist)
>>> m
['x', '3', 'b']
>>> j = ', '.join(m)
>>> j
'x, 3, b'
Tom Zych
la source
2

Utilisation .formatpour le formatage de chaîne,

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

Production:

[x, 3, b]

Explication:

  1. mapest utilisé pour mapper chaque élément de la liste à stringtaper.
  2. Les éléments sont réunis en une chaîne avec ,comme séparateur.
  3. Nous utilisons [et ]dans l'instruction print pour afficher les accolades de la liste.

Référence: .formatpour le formatage des chaînes PEP-3101

Ani Menon
la source
Génial! Je trouve en utilisant .formatla manière la plus pythonique. Mais, bien sûr, j'accepte les désaccords. ;)
aimé.par.Jésus
0

J'ai été inspiré par @AniMenon pour écrire une solution pythonique plus générale.

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

Il n'utilise que la formatméthode. Aucune trace de str, et il permet un réglage fin du format des éléments. Par exemple, si vous avez des nombres flottants comme éléments de la liste, vous pouvez ajuster leur format, en ajoutant un spécificateur de conversion, dans ce cas:.2f

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

La sortie est assez correcte:

[1.85, -6.33, 4000.21]
aimé.par.Jésus
la source