Automatiser les trucs ennuyeux avec Python: par des Virgules Code
Actuellement en train de travailler mon chemin à travers les débutants ce livre et qui ont terminé l'un des projets les par des Virgules Code " qui demande à l'utilisateur de construire un programme qui:
prend une valeur de la liste en argument et renvoie
une chaîne avec tous les éléments séparés par une virgule et un espace, et avec
inséré, avant le dernier élément. Par exemple, le passage de la ci-dessous liste des spams à
la fonction serait de retour " des pommes, des bananes, du tofu, et des chats. Mais votre fonction
doit être capable de travailler avec n'importe quel valeur de la liste passée.
spam = ['apples', 'bananas', 'tofu', 'cats']
Ma solution pour le problème (Qui fonctionne parfaitement bien):
spam= ['apples', 'bananas', 'tofu', 'cats']
def list_thing(list):
new_string = ''
for i in list:
new_string = new_string + str(i)
if list.index(i) == (len(list)-2):
new_string = new_string + ', and '
elif list.index(i) == (len(list)-1):
new_string = new_string
else:
new_string = new_string + ', '
return new_string
print (list_thing(spam))
Ma seule question, est il possible que je peux raccourcir mon code? ou de le rendre plus "pythonic'?
Voici mon code.
def listTostring(someList):
a = ''
for i in range(len(someList)-1):
a += str(someList[i])
a += str('and ' + someList[len(someList)-1])
print (a)
spam = ['apples', 'bananas', 'tofu', 'cats']
listTostring(spam)
sortie: des pommes, des bananes, du tofu, et les chats
- si vous avez le code du travail alors c'est plus adapté pour les codereview.stackexchange.com si vous souhaitez qu'il a passé en revue
- Notez que votre code ne fonctionne pas de la dernière chaîne de la liste est une répétition de tout premiers éléments.
- Désolé, ne se reproduira pas et merci pour l'astuce.
- Ne savais même pas qu', merci de me le faire savoir!
- Remarque l'exemple de sortie utilise le Oxford comma:
'apples, bananas, tofu, and cats'
, donc il y a une virgule aprèstofu
. Qui rend le problème un peu délicat...
Vous devez vous connecter pour publier un commentaire.
Utilisation
str.join()
à se joindre à une séquence de chaînes de caractères avec un délimiteur. Si vous le faites pour tous les mots sauf pour la dernière, vous pouvez insérer' and '
il ya lieu:Faire:
words[-1]
prend le dernier élément d'une liste.words[:-1]
tranches la liste de produire une nouvelle liste avec tous les mots sauf le dernier.', '.join()
produit une nouvelle chaîne, avec toutes les cordes de l'argument destr.join()
rejoint avec', '
. S'il y a un élément dans la liste d'entrée, qu'un élément est retourné, non.'{}, and {}'.format()
insère la virgule-joint mots et le dernier mot dans un modèle (avec Oxford comma).Si vous passez dans une liste vide, la fonction ci-dessus génère une
IndexError
exception; vous pouvez tester plus précisément pour ce cas dans la fonction si vous vous sentez d'une liste vide est valable de cas d'utilisation pour la fonction.La rejoint tous les mots sauf le dernier avec
', '
, puis ajoute le dernier mot à la suite avec' and '
.Noter que si il n'y a qu'un seul mot, vous obtenez ce seul mot; il n'y a rien à se joindre dans ce cas. Si il y a deux, vous obtenez
'word1 and word 2'
. Plus de mots produit'word1, word2, ... and lastword'
.Démo:
'{} and {}'.format(...)
semble plus propre à moi quand il vient à peine de 2 chaînes de caractères.str.format()
ne le serait pas.', '.join()
retourne une chaîne vide dans ce cas, il ne fonctionne pas de toute façon. Commuté.J'ai utilisé une approche différente. Je suis un débutant, donc je ne sais pas si c'est la façon la plus propre de le faire. Pour moi, il semblait que le moyen le plus simple:
Qui donnera le résultat:
J'ai essayé cela, l'espoir, c'est ce que vous cherchez :-
list
comme un nom de variable, que les ombres de l'intégré danslist
type. Il ne cause pas un problème ici, mais il fait un peu le code source de confusion pour les autres lecteurs, et peut conduire à de mystérieux insectes.Voici une solution qui gère le Oxford comma correctement. Il a également fait face avec une liste vide, auquel cas il renvoie une chaîne vide.
sortie
D'autres ont donné d'excellents one-liner solutions, mais une bonne façon d'améliorer votre implémentation réelle, et de corriger le fait qu'il ne fonctionne pas lorsque les éléments sont répétés - est d'utiliser des
enumerate
dans la boucle for pour garder une trace de l'indice, plutôt que d'utiliserindex
, qui trouve toujours de la première apparition de la cible.Le format de déclaration est plus propre.
Cela a fonctionné pour moi aussi:
', and '
Mon interprétation de la question est telle qu'un seul élément de la liste sera aussi le dernier élément de la liste, et en tant que tel aurait besoin de l' " et "inséré avant, ainsi que deux de la liste des items renvoyant à la fois à'
, and
" entre eux. Donc aucun besoin de traiter avec un seul ou de deux listes d'objets séparément, seulement les n premiers éléments, et le dernier élément.Je voudrais aussi noter que, bien que bonne, beaucoup d'autres articles d'utiliser des modules et des fonctions qui ne sont pas enseignées dans les Automatiser les Trucs Ennuyeux texte par le temps, l'étudiant est confronté à cette question (un étudiant comme moi avait vu
join
et.format
ailleurs, mais a tenté d'utiliser uniquement ce qui a été enseigné dans le texte).Et vous pourriez gérer la liste vide au cas par:
Que la fonction doit travailler pour tous liste des valeurs transmises, y compris des entiers, donc il devrait être en mesure de retour/imprimer toutes les valeurs c'est à dire que str(). Mon travail entièrement code ressemble à ceci:
Juste un simple code. Je pense que nous n'avons pas besoin d'utiliser toute la fantaisie de trucs ici. :p
Que l'on gagne pour des raisons de simplicité Hein.
Seulement, l'auteur précise:
Pour accompagner non chaînes, ajoutez
str()
balises à al [i] fonctions.spam = ['apples', 'bananas', 'tofu', 'cats', 'bears', 21]
def pList(x):
for i in range(len(x) - 2):
print(str(x[i]) + ', ', end='')
print(str(x[-2]) + ' and ' + str(x[-1]))
pList(spam)
Je suis assez nouveau pythonista. Dans la question, il a été demandé que le retour de la fonction, le contenu de la liste comme une chaîne de caractères dans le format que les autres solutions de ce forum ont "imprimé" il. La suite est (à mon avis) un nettoyeur de solution à ce problème.
Ce qui illustre bien la virgule solution de code du chapitre 4 [Listes] dans Automatiser Les Trucs Ennuyeux.
Je suis venu avec cette solution
Comme il n'a pas été mentionné, voici une réponse avec f de la ficelle, pour référence:
Un exemple interpolant un message personnalisé et en acceptant aussi une chaîne de caractères comme argument:
Je n'étais pas satisfait de l'un des solutions, car aucun de manipuler le cas avec
or
, par exempleapples, bananas, or berries
Sinon, cette solution est plus ou moins identique à celui fourni par @PM2Ring
Pas de boucles, pas de joint, à seulement deux instructions d'impression:
C'est ce que j'ai fait de l'OMI, il est plus intuitif...
Pourquoi tout le monde est à mettre alors les codes complexes.
Voir mon code ci-dessous. C'est le plus simple et le plus facile à comprendre d'un seul coup, même pour un débutant.
après le codage ci-dessus, il suffit de taper comma_code(spam) dans le python shell et vous êtes bon pour aller. Profitez de
spam = ['Cats']
, vous obtenez "et Chats", de sorte que votre solution ne satisfait pas la demande...Voici ma solution. Une fois j'ai trouvé la méthode join, et comment il fonctionne, le reste a suivi.
Je suis nouveau sur python, il y a peut être d'autres solutions plus simples, mais voici la mienne
spam
tableau.