Méthode pythonique pour imprimer les éléments de la liste

114

Je voudrais savoir s'il existe une meilleure façon d'imprimer tous les objets dans une liste Python que celle-ci:

myList = [Person("Foo"), Person("Bar")]
print("\n".join(map(str, myList)))
Foo
Bar

Je lis de cette façon n'est pas vraiment bon:

myList = [Person("Foo"), Person("Bar")]
for p in myList:
    print(p)

N'y a-t-il pas quelque chose comme:

print(p) for p in myList

Sinon, ma question est ... pourquoi? Si nous pouvons faire ce genre de choses avec des listes complètes, pourquoi pas comme une simple déclaration en dehors d'une liste?

Guillaume Voiron
la source
3
Où avez-vous eu l'impression que l'utilisation for p in myListn'était "pas vraiment bonne"?
Jon Clements
@JonClements: chrisarndt.de/talks/rupy/2008/output/slides.html
Guillaume Voiron
@pelotasplus: pas du tout :) Et au fait je n'aime pas trop ma première version qui n'est pas "lisible"
Guillaume Voiron

Réponses:

220

En supposant que vous utilisez Python 3.x:

print(*myList, sep='\n')

Vous pouvez obtenir le même comportement sur Python 2.x en utilisant from __future__ import print_function, comme indiqué par mgilson dans les commentaires.

Avec l'instruction print sur Python 2.x, vous aurez besoin d'une certaine itération, concernant votre question sur le fait de print(p) for p in myListne pas fonctionner, vous pouvez simplement utiliser ce qui suit qui fait la même chose et est toujours une ligne:

for p in myList: print p

Pour une solution qui utilise '\n'.join(), je préfère les compréhensions de liste et les générateurs, map()donc j'utiliserais probablement ce qui suit:

print '\n'.join(str(p) for p in myList) 
Andrew Clark
la source
3
Et sinon, vous pouvez from __future__ import print_functionsur python2.6 et plus récent.
mgilson
en python 2x, l'utilisation de map est légèrement plus rapide que l'utilisation de join sur une liste de compréhension.
Juan Carlos Moreno
1
Pourquoi le vote négatif, est-ce vraiment dû à la différence de vitesse entre map()et un générateur? Le créateur de Python préfère également les compréhensions et les générateursmap() .
Andrew Clark
Je n'ai pas voté contre toi. Je connais ce post de GVR qui était sa façon de dire, à l'époque, comment les futures versions de python n'allaient pas l'inclure, mais elles ont fini par rester.
Juan Carlos Moreno
1
Ils sont restés dans Python 3.x, mais son point dans cet article est que [F(x) for x in S]c'est plus clair que map(F, S). Les performances ne sont pas abordées ici, mais je m'attendrais à ce que la différence de vitesse soit négligeable. Quoi qu'il en soit, j'étais juste confus au sujet du vote négatif, désolé j'ai supposé que c'était vous!
Andrew Clark
28

Je l'utilise tout le temps :

#!/usr/bin/python

l = [1,2,3,7] 
print "".join([str(x) for x in l])
lucasg
la source
1
Pour ajouter format(), remplacez le str(x)par une chaîne de format:print " ".join(["{:02d}".format(x) for x in l])
ChrisFreeman
8

[print(a) for a in list] donnera un tas de types Aucun à la fin bien qu'il imprime tous les éléments

ytpillai
la source
c'est ce que j'utilise jusqu'à présent. C'est une ligne, très claire et expressive, mais les plaintes linter "L'expression n'est assignée à rien"
alete
1
Si vous voulez troller le linter, vous pouvez créer une fonction distincte qui l'affiche et renvoie une valeur stupide et appelle cette fonction dans la compréhension de la liste
ytpillai
3

Pour Python 2. *:

Si vous surchargez la fonction __str __ () pour votre classe Person, vous pouvez omettre la partie avec map (str, ...). Une autre façon de procéder consiste à créer une fonction, comme vous l'avez écrit:

def write_list(lst):
    for item in lst:
        print str(item) 

...

write_list(MyList)

Il y a en Python 3. * l'argument sep pour la fonction print (). Jetez un œil à la documentation.

gukoff
la source
3

Expansion de la réponse de @ lucasg (inspirée du commentaire qu'il a reçu):

Pour obtenir une sortie de liste formatée , vous pouvez faire quelque chose du genre:

l = [1,2,5]
print ", ".join('%02d'%x for x in l)

01, 02, 05

Maintenant, le ", "fournit le séparateur (uniquement entre les éléments, pas à la fin) et la chaîne de formatage '02d'combinée avec %xdonne une chaîne formatée pour chaque élément x- dans ce cas, formatée comme un entier à deux chiffres, rempli à gauche de zéros.

Floris
la source
2

Pour afficher chaque contenu, j'utilise:

mylist = ['foo', 'bar']
indexval = 0
for i in range(len(mylist)):     
    print(mylist[indexval])
    indexval += 1

Exemple d'utilisation dans une fonction:

def showAll(listname, startat):
   indexval = startat
   try:
      for i in range(len(mylist)):
         print(mylist[indexval])
         indexval = indexval + 1
   except IndexError:
      print('That index value you gave is out of range.')

J'espère que j'ai aidé.

ShinyMemes
la source
1
À titre indicatif, veuillez cocher la réponse ci-dessus. Vous utilisez une plage, qui fournit une valeur d'index, i, mais vous utilisez une autre variable, indexval, comme index ?? Vous vous battez contre la simplicité de python. for val in my_list: print val fait la même chose que ce que vous avez
BretD
1

Je pense que c'est le plus pratique si vous voulez juste voir le contenu dans la liste:

myList = ['foo', 'bar']
print('myList is %s' % str(myList))

Simple, facile à lire et peut être utilisé avec une chaîne de format.

Rongzhao Zhang
la source
1

La question d'OP est: est -ce que quelque chose comme suivant existe, sinon pourquoi

print(p) for p in myList # doesn't work, OP's intuition

La réponse est, il existe ce qui est:

[p for p in myList] #works perfectly

Fondamentalement, utilisez []pour la compréhension de liste et printévitez d'imprimerNone . Pour voir pourquoi les printimpressions Nonevoient ceci

Gaurav Singhal
la source
1

J'ai récemment créé un générateur de mot de passe et bien que je sois TRÈS NOUVEAU en python, je l'ai fouetté comme un moyen d'afficher tous les éléments d'une liste (avec de petites modifications pour répondre à vos besoins ...

    x = 0
    up = 0
    passwordText = ""
    password = []
    userInput = int(input("Enter how many characters you want your password to be: "))
    print("\n\n\n") # spacing

    while x <= (userInput - 1): #loops as many times as the user inputs above
            password.extend([choice(groups.characters)]) #adds random character from groups file that has all lower/uppercase letters and all numbers
            x = x+1 #adds 1 to x w/o using x ++1 as I get many errors w/ that
            passwordText = passwordText + password[up]
            up = up+1 # same as x increase


    print(passwordText)

Comme je l'ai dit, IM TRÈS NOUVEAU en Python et je suis sûr que c'est un peu maladroit pour un expert, mais je suis juste ici pour un autre exemple

Nate Baker
la source
0

En supposant que vous êtes d'accord avec l'impression de votre liste [1,2,3], alors un moyen simple en Python3 est:

mylist=[1,2,3,'lorem','ipsum','dolor','sit','amet']

print(f"There are {len(mylist):d} items in this lorem list: {str(mylist):s}")

L'exécution de ceci produit la sortie suivante:

Il y a 8 éléments dans cette liste de lorem: [1, 2, 3, 'lorem', 'ipsum', 'dolor', 'sit', 'amet']

Éthalides
la source