web-dev-qa-db-fra.com

Imprimer une liste d'éléments séparés par des espaces dans Python 3

J'ai une liste L d'éléments, disons des nombres naturels. Je veux les imprimer sur une ligne avec un espace unique en tant que séparateur. Mais je ne veux pas un espace après le dernier élément de la liste (ou avant le premier).

En Python 2, cela peut facilement être fait avec le code suivant. L'implémentation de la déclaration print (mystérieusement, je dois l'avouer) évite d'imprimer un espace supplémentaire avant la nouvelle ligne.

L = [1, 2, 3, 4, 5]
for x in L:
    print x,
print

Cependant, dans Python 3, il semble que le code (supposé) équivalent utilisant la fonction print crée un espace après le dernier nombre:

L = [1, 2, 3, 4, 5]
for x in L:
    print(x, end=" ")
print()

Bien sûr, il y a des réponses faciles à ma question. Je sais que je peux utiliser la concaténation de chaînes:

L = [1, 2, 3, 4, 5]
print(" ".join(str(x) for x in L))

C'est une très bonne solution, mais comparée au code Python 2, je la trouve contre-intuitive et nettement plus lente. De plus, je sais que je peux choisir d’imprimer moi-même un espace, comme:

L = [1, 2, 3, 4, 5]
for i, x in enumerate(L):
    print(" " if i>0 else "", x, sep="", end="")
print()

mais encore une fois c'est pire que ce que j'avais dans Python 2.

Ma question est donc la suivante: quelque chose me manque-t-il dans Python 3? Le comportement que je recherche est-il pris en charge par la fonction print?

24
nickie

Vous pouvez appliquer la liste en tant qu'arguments séparés:

print(*L)

et laissez print() se charger de convertir chaque élément en chaîne. Comme toujours, vous pouvez contrôler le séparateur en définissant le mot clé sep:

>>> L = [1, 2, 3, 4, 5]
>>> print(*L)
1 2 3 4 5
>>> print(*L, sep=', ')
1, 2, 3, 4, 5
>>> print(*L, sep=' -> ')
1 -> 2 -> 3 -> 4 -> 5

Sauf si vous avez besoin de la chaîne jointe pour autre chose, c'est la méthode la plus simple. Sinon, utilisez str.join():

joined_string = ' '.join([str(v) for v in L])
print(joined_string)
# do other things with joined_string

Notez que cela nécessite une conversion manuelle en chaînes pour toutes les valeurs autres que des chaînes dans L!

67
Martijn Pieters

Bien que la réponse acceptée soit absolument claire, je voulais simplement vérifier l'efficacité en termes de temps.

Le meilleur moyen consiste à imprimer une chaîne jointe de nombres convertis en chaînes.

print(" ".join(list(map(str,l))))

Notez que j'ai utilisé map au lieu de loop . J'ai écrit un petit code des 4 manières différentes de comparer le temps:

import time as t

a, b = 10, 210000
l = list(range(10, 21000))
tic = t.time()
for i in l:
    print(i, end=" ")

print()
tac = t.time()
t1 = (tac - tic) * 1000
print(*l)
toe = t.time()
t2 = (toe - tac) * 1000
print(" ".join([str(i) for i in l]))
joe = t.time()
t3 = (joe - toe) * 1000
print(" ".join(list(map(str, l))))
toy = t.time()
t4 = (toy - joe) * 1000
print("Time,t1,t2,t3,t4")

Résultat:

Temps 74344,76 71790,83 196,99 153,99

La sortie était assez surprenante pour moi. Grande différence de temps dans les cas de «méthode de boucle» et de «méthode de chaîne jointe».

Conclusion: N'utilisez pas de boucles pour imprimer une liste si la taille est trop grande (de l'ordre de 10 ** 5 ou plus).

1
Amit Dwivedi
list = [1, 2, 3, 4, 5]
for i in list[0:-1]:
    print(i, end=', ')
print(list[-1])

faire pour les boucles prend vraiment beaucoup plus de temps à courir?

essayait de faire quelque chose qui imprimait toutes les valeurs de str dans une liste séparée par des virgules, insérant "et" avant la dernière entrée et aboutissant à ceci:

spam = ['apples', 'bananas', 'tofu', 'cats']
for i in spam[0:-1]:
    print(i, end=', ')
print('and ' + spam[-1])
0
mashkitty