2016-07-04 14 views
3

Ich habe eine Zeichenfolge wie '.... (((... ((') für die ich eine andere Zeichenfolge generieren muss 'ss (4) h5 (3) ss (3), h2 (2) ss (3) 'Zeichenzählung der Sequenzen generieren

'. 'entspricht 'ss' und die Anzahl der kontinuierlichen'. 'ist in der Halterung.

'(' entspricht' h5 'und die Anzahl der Continuos' ('ist in der Klammer.

Derzeit kann ich den Ausgang' ss (4) h5 (3) ss (3) 'und meine Code ignoriert die letzten zwei Zeichenfolgen. Dies ist, was ich bisher getan

def main(): 
    stringInput = raw_input("Enter the string:") 
    ssCount = 0 
    h5Count = 0 
    finalString = "" 
    ssString = "" 
    h5String = "" 
    ssCont = True 
    h5Cont = True 
    for i in range(0, len(stringInput), 1): 
     if stringInput[i] == ".": 
      h5Cont = False 
      if ssCont: 
       ssCount = ssCount + 1 
       ssString = "ss(" + str(ssCount) + ")" 
       ssCont = True 
      else: 
       finalString = finalString + ssString 
       ssCont = True 
       ssCount = 1 
     elif stringInput[i] == "(": 
      ssCont = False 
      if h5Cont: 
       h5Count = h5Count + 1 
       h5String = "h5(" + str(h5Count) + ")" 
       h5Cont = True 
      else: 
       finalString = finalString + h5String 
       h5Cont = True 
       h5Count = 1 

    print finalString 
main() 

Wie Sie den Code ändern, um die gewünschte Ausgabe zu erhalten?

+0

Guter Aufwand - kann ich fragen, ob Sie mit stecken Das Problem auf diese Weise angehen, weil es eine Art von Aufgabe ist oder sind Sie offen für andere Pythonic-Optionen? –

+0

@ JonClements Ich bin offen für alle Pythonic Optionen. Ich möchte nur die gewünschte Ausgabe erhalten. – coderSree

Antwort

4

Ich weiß nicht über die Änderung Ihrer bestehenden Code, aber für mich kann dies sehr prägnant und pythonisch mit itertools.groupby getan werden. Beachten Sie, dass ich nicht sicher bin, ob die 'h2' in Ihrer erwarteten Ausgabe ein Tippfehler ist oder ob es 'h5' sein sollte, die ich annahm.

from itertools import chain, groupby 

string = '....(((...((...' 

def character_count(S, labels): # this allows you to customize the labels you want to use 
    for K, G in groupby(S): 
     yield labels[K], '(', str(sum(1 for c in G)), ')' # sum() counts the number of items in the iterator G 

output = ''.join(chain.from_iterable(character_count(string, {'.': 'ss', '(': 'h5'}))) # joins the components into a single string 
print(output) 

# >>> ss(4)h5(3)ss(3)h5(2)ss(3) 
+0

Danke. Genau das habe ich gebraucht! :) – coderSree

1

@Kelvin ‚s Antwort ist groß, aber wenn Sie eine Funktion selbst definieren mögen, können Sie es wie dies tun könnten:

def h5ss(x): 
    names = {".": "ss", "(": "h5"} 
    count = 0 
    current = None 
    out = "" 
    for i in x: 
     if i == current: 
      count += 1 
     else: 
      if current is not None: 
       out += "{}({})".format(names[current], count) 
      count = 1 
      current = i 
    if current is not None: 
     out += "{}({})".format(names[current], count) 
    return out 
+0

Funktioniert gut, wirklich hilfreich. Danke :) – coderSree

+0

@ user5861486 Kein Problem. Btw, das Problem in Ihrem Code ist, dass Sie die Zeichenfolgen für "ss" und "h5" direkt zur Ausgabe hinzufügen sollten, und nicht nur, wenn die nächste Sequenz beendet ist. Deshalb fehlen die letzten beiden. – CodenameLambda