J'ai une liste de peut-être une centaine d'éléments qui est en fait un e-mail avec chaque ligne en tant qu'élément. La liste est légèrement variable car les lignes qui contiennent un \ n sont placées dans un élément séparé, donc je ne peux pas simplement découper en utilisant des valeurs fixes. J'ai besoin essentiellement d'une phrase de départ et d'arrêt variable (doit être une recherche partielle aussi parce que l'une de mes phrases de départ pourrait effectivement être Total Cost: $13.43
alors je voudrais simplement utiliser Total Cost:
.) Même chose avec la phrase de fin. Je ne souhaite pas non plus inclure les phrases de début/de fin dans la liste renvoyée. En résumé:Python: Trouver X à Y dans une liste de chaînes
>>> email = ['apples','bananas','cats','dogs','elephants','fish','gee']
>>> start = 'ban'
>>> stop = 'ele'
# the magic here
>>> print new_email
['cats', 'dogs']
NOTES
- Sans mise en forme parfaite de l'e-mail, il est assez cohérent donc il y a une chance mince, un start/stop phrase se produira plus d'une fois.
- Il n'y a pas non plus d'éléments vides.
SOLUTION
Juste pour funzies et grâce à l'aide de tout le monde ici est mon code final:
def get_elements_positions(stringList=list(), startPhrase=None, stopPhrase=None):
elementPositionStart, elementPositionStop = 0, -1
if startPhrase:
elementPositionStart = next((i for i, j in enumerate(stringList) if j.startswith(startPhrase)), 0)
if stopPhrase:
elementPositionStop = next((i for i, j in enumerate(stringList) if j.startswith(stopPhrase)), -1)
if elementPositionStart + 1 == elementPositionStop - 1:
return elementPositionStart + 1
else:
return [elementPositionStart, elementPositionStop]
Il retourne une liste avec la position de l'élément de départ et de fin et par défaut à 0 et -1 si la valeur correspondante ne peut pas être trouvée. (0 étant le premier élément et -1 étant le dernier).
SOLUTION-B
J'ai fait un petit changement, maintenant si la liste est décrit un début et la position d'arrêt résultant en 1 élément entre elle retourne que les éléments la position comme un entier au lieu d'une liste que vous toujours obtenir des retours multi-ligne.
Merci encore!
vous n'avez pas besoin de retourner la liste, retourner tuple fonctionne généralement très bien. [Avoir 'list()' comme valeur par défaut fait quelque chose de complètement différent.] (Http://docs.python.org/tutorial/controlflow.html#default-argument-values). La raison pour laquelle mon code est tel quel est DRY. – SilentGhost
Oui, je travaille toujours sur l'ensemble de la chose "bon programmeur python". J'ai commencé à apprendre Python en conjonction avec Django, donc je pense que j'ai probablement manqué beaucoup de petites fonctionnalités de Python mais je suis en train d'apprendre. – TheLizardKing