2016-06-13 11 views
0

Ich habe an einem Programm gearbeitet, das die Anzahl der Buchstaben in einem geben Datensatz zählen konnte, die mit >chrome beginnen, gefolgt von langen Ketten von Buchstaben (a,b,c,d at random). Die Datenblöcke genau so aussehen:Iterieren über einige Stücke von Daten beginnend mit bestimmten Zeichenfolgen

("\n" shows space in the command line): ">chrome0001"\n"abcdbadbcbdabdcbdbbbbadbcbbdab>chrome0011" \n"bbbbadbcbabdbaaaadbcbddcdda>chrome0111"\n" .... (the total number of ">chrome" is 10)."

ich die Zahlen von Buchstaben zählen möchten, die nach jedem >chrome erscheinen. Und erwartete Ausgabe soll wie:

>>chrome0001 a:4 b:6 c:10 d: 11

Ich habe darüber nachgedacht, ob ich \n verwenden könnte und >chrome das Programm zum Laufen zu bringen, aber blieb stecken und studierte viele Fragen und Antworten auf dieser Website nur zu graben Loch tiefer ... kann mir bitte jemand helfen?

+0

Könnten Sie bitte Ihre Eingabe und die gewünschte Ausgabe beschreiben, damit wir herausfinden können, was Sie brauchen? – Brian

+0

Sicher, danke. Ich möchte jedes Chrom-Tag und die Anzahl der Buchstaben unter dem Tag drucken. Alles, was ich wissen möchte, ist, wie man jedes Mal, wenn> Chrome angetroffen wird, den Zählvorgang wiederholt. –

+1

'

Antwort

1

Dies ist ein relativ einfaches Analyseproblem. Zuerst möchten Sie die Zeichenfolge auf die chromeXYZ\n Bits aufteilen und es mit der folgenden Zeichenfolge gruppieren. Wir können dies tun, ziemlich leicht mit regulären Ausdrücken - Hier ist eine, die funktioniert, wenn ich Ihre Eingabe richtig verstehen:

>>> import re 
>>> s = ">chrome0001\nabcdbadbcbdabdcbdbbbbadbcbbdab>chrome0011\nbbbbadbcbabdbaaaadbcbddcdda>chrome0111\n" 
>>> re.findall(r'(>chrome\d+\n)([^>]+)', s) 
[('>chrome0001\n', 'abcdbadbcbdabdcbdbbbbadbcbbdab'), ('>chrome0011\n', 'bbbbadbcbabdbaaaadbcbddcdda')] 

Der reguläre Ausdruck geradlinig ist (zumindest so weit wie regex gehen ...):

  • (>chrome\d+\n) - "> chrome", einige Zahlen und ein newline
  • ([^>]+) - Spiele alle Zeichen bis zum nächsten > oder am Ende des Eingangs.

Von hier aus ist das Zählen der Anzahl der Zeichen in der Untersequenz ziemlich einfach. Sie können ein collections.Counter verwenden, das schwere Heben zu tun:

>>> from collections import Counter 
>>> for chrome, alpha in re.findall(r'(>chrome\d+\n)([^>]+)', s): 
... print(chrome, Counter(alpha)) 
... 
('>chrome0001\n', Counter({'b': 14, 'd': 7, 'a': 5, 'c': 4})) 
('>chrome0011\n', Counter({'b': 10, 'a': 7, 'd': 7, 'c': 3})) 
+0

Natürlich hat Python eine Counter-Klasse! –

+0

@AaronTaggart - FWIW, es wurde erst python2.7 hinzugefügt (was es schon seit ein paar Jahren gibt, aber definitiv nicht für die meiste Zeit der Sprache :) – mgilson

Verwandte Themen