Itérer une chaîne de format sur une liste
En Lisp, vous pouvez avoir quelque chose comme ceci:
(setf my-stuff '(1 2 "Foo" 34 42 "Ni" 12 14 "Blue"))
(format t "~{~d ~r ~s~%~}" my-stuff)
Ce qui serait le plus Pythonic moyen pour parcourir au cours de cette même liste? La première chose qui vient à l'esprit est:
mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
for x in xrange(0, len(mystuff)-1, 3):
print "%d %d %s" % tuple(mystuff[x:x+3])
Mais qui se sent juste gênant pour moi. Je suis sûr qu'il ya une meilleure façon?
Bien, à moins que quelqu'un plus tard, offre un meilleur exemple, je pense que gnibbler la solution la plus belle\la plus proche, si elle ne peut pas être tout à fait aussi évident au premier abord comment il est ce qu'il fait:
mystuff = [1, 2, "Foo", 34, 42, "Ni", 12, 14, "Blue"]
for x in zip(*[iter(mystuff)]*3):
print "{0} {1} {2}".format(*x)
En aparté, n'est-ce pas maladroit telle terriblement mot merveilleux? Il vient de regarde maladroit!
Il a l'air gêné dans la comparaison, mais ce n'est vraiment pas mauvais.
+1 parce que je n'ai aucune idée de si tu faisais référence à mon commentaire ou le code. Veuillez ne pas le préciser, l'ambiguïté est beaucoup plus amusant/intéressant!
Il a l'air gêné dans la comparaison, mais ce n'est vraiment pas mauvais.
+1 parce que je n'ai aucune idée de si tu faisais référence à mon commentaire ou le code. Veuillez ne pas le préciser, l'ambiguïté est beaucoup plus amusant/intéressant!
OriginalL'auteur Wayne Werner | 2010-07-01
Vous devez vous connecter pour publier un commentaire.
Ou à l'aide de
.format
Si la chaîne de format n'est pas codé en dur, vous pouvez l'analyser pour savoir combien de termes par ligne
Mettre tous ensemble donne
Werner, bien sur vous pour travailler pourquoi ça fonctionne
OriginalL'auteur John La Rooy
Pour commencer, j'aimerais utiliser la nouvelle mise en forme de chaîne méthodes de 2,6+
OriginalL'auteur Josh Wright
Je pense que
join
est le plus similaire fonction en Python:C'est un peu le pire quand vous avez plusieurs objets à l'intérieur, comme vous le voyez, mais si vous avez un groupe-par fonction (ce qui est vraiment utile de toute façon!), Je pense que vous pouvez le faire fonctionner sans trop de difficultés. Quelque chose comme:
Ouais, je suppose que cela dépend de combien vous voulez tricher. Vous pourriez port
FORMAT
de Python et de direFORMAT(True, "~{~d ~r ~s~%~}", my_stuff)
, si vous étiez vraiment s'ennuyer le week-end. 🙂J'ai été tenté! Bien sûr, je souhaite également que le
~r
faisaient partie de libs Python, trop... Il y a déjà un module sur sourceforge: sourceforge.net/projects/pynum2wordOriginalL'auteur Ken
Je dirais que la plupart des Pythonic serait de rendre la liste plus loin:
[x for x in zip(*[iter(mystuff)]*3)]
=[(1, 2, 'foo'), (34, 42, 'ni'), (12, 14, 'blue')]
Assez lisse, neh?Je le sais, mais je pense que c'est plus Pythonic juste pour avoir la liste sous cette forme pour commencer. C'était la question de départ, à droite?
Eh bien, j'ai été un peu ambigu, donc j'ai corrigé le texte. J'ai vraiment été plus intéressé par l'itération/mise en forme de la partie - la consommation d'un certain nombre de valeurs de la liste par itération. Mais en termes de l'ensemble du "programme", votre solution serait plus pythonic
OriginalL'auteur Walter Mundt
Très compréhensible, je pense que
OriginalL'auteur eyquem
Deux liner basé sur Wright:
OriginalL'auteur ksed