J'ai un fichier texte qui ressemble à ceci:
> Début du groupe P>
text1 p>
text2 p>
> Début du nouveau groupe P>
text3 p> blockQuote>
J'ai essayé d'utiliser
itheroTools.groupby code> pour renvoyer des groupes dans laquelle chaque groupe est une liste de listes contenant: p>
1) ligne commençant par le "> "Caractère. p>
2) Les lignes de texte suivant la ligne commençant par le caractère"> ", jusqu'à la ligne suivante commençant par le caractère"> ". P>
Donc, du texte précédent, je voudrais obtenir: p>
xxx pré> Le code que j'ai écrit jusqu'à présent est: p>
[['>Start of group'],[text1],[text2],['>Start of new group'],[text3]]
3 Réponses :
Voici un moyen d'obtenir vos données sans la fonction de groupeby.
fin = open('fasta.out', 'r') data = [] for line in fin: line = line.rstrip() if line.startswith('>'): data.append([line]) else: data[-1].append(line)
Un peu plus propre: si ligne.startswith ('>'): données.append ([]); Data [-1] .append (ligne) code>.
Cela dit, si vous regardez cela comme un défi codant plutôt que de résoudre un problème mondial réel, vous pouvez créer une fonction de regroupement qui stocke l'état et conserve la trace de la dernière étiquette de groupe vue. Une classe qui implémente GroupBy Code> Groupes Articles dans une iTable par un prédicat appliqué à chaque élément. Cela signifie que le prédicat du regroupement doit pouvoir identifier la fonctionnalité regroupée en regardant un seul élément. Étant donné que vos données ne permettent pas (vous devez regarder des éléments précédents pour déterminer la clé de regroupement), ce n'est pas un bon candidat à utiliser
GroupBy CODE> et que Chris Charley's répond est une solution plus propre. P >
__ appel __ code> et stocke la dernière étiquette de groupe considérée comme une propriété et renvoie que lorsque la prochaine entrée n'est pas une étiquette de groupe pourrait réaliser ce que vous recherchez. P>
La clé est de baliser chaque ligne dans le même groupe avec le même numéro, qui peut être effectué avec un autre générateur. Considérez cela une démonstration de la façon dont groupby code> fonctionne plutôt qu'une suggestion pratique; Utilisez la réponse de Chris Charley à la place.
from operator import itemgetter
with open(filename) as rfile:
numbered_lines = number(rfile)
groups = [[line for n, line in group]
for number, group in groupby(numbered_lines, itemgetter(0))]
itheroTools.groupby code> a des groupes d'articles avec des caractéristiques communes, par exemple. Grouper toutes les lettres majuscules, regroupez tous les mots commençant par "FOO". Il serait plus difficile d'utiliser ici car vous voulez vraiment simplement diviser la chaîne avant une condition. Voir ici sur Quand utiliser
groupby code>