0
votes

Puis-je utiliser itheroTools.groupby pour revenir à des groupes de lignes où la première ligne commence par un caractère spécifique?

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]]


1 commentaires

itheroTools.groupby 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


3 Réponses :


2
votes

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)


1 commentaires

Un peu plus propre: si ligne.startswith ('>'): données.append ([]); Data [-1] .append (ligne) .



0
votes

GroupBy 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 et que Chris Charley's répond est une solution plus propre.

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 __ appel __ 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.


0 commentaires

0
votes

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))]


0 commentaires