2016-07-04 3 views
3

У меня есть строка типа '.... ((... ((...', для которой я должен сгенерировать другую строку 'ss (4) h5 (3) сс (3) h2 (2) сс (3) 'Генерировать число символов последовательностей

'. 'соответствует 'SS' и числа непрерывной'. 'находится в кронштейне.

'(' соответствует' h5 'и количество континуосов (' находится в скобке.

В настоящее время я могу получить выходные данные ss (4) h5 (3) ss (3) 'и мой код игнорирует последние две последовательности символов. Это то, что я сделал до сих пор

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

Как изменить код, чтобы получить желаемый результат?

+0

Хорошее усилие - я могу спросить, если вы застряли Таким образом, он подходит к проблеме из-за того, что она является присвоением какого-то рода или вы открыты для других вариантов Pythonic? –

+0

@JonClements Я открыт для любых вариантов pythonic. Я просто хочу получить желаемый результат. – coderSree

ответ

4

Я не знаю об изменении существующего кода, но для меня это можно сделать очень лаконично и питонически, используя itertools.groupby. Обратите внимание: я не уверен, что 'h2' в вашем ожидаемом выходе является опечаткой, или если он должен быть 'h5', который я предполагаю.

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

Спасибо. Это именно то, что мне нужно! :) – coderSree

1

ответ @Kelvin «s велик, однако если вы хотите, чтобы определить функцию самостоятельно, вы можете сделать это следующим образом:

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

Работает хорошо, очень полезно. Спасибо :) – coderSree

+0

@ user5861486 Нет проблем. Кстати, проблема в вашем коде заключается в том, что вы должны добавлять строки для «ss» и «h5» к выходу напрямую, а не только в том случае, если следующая последовательность будет закончена. Вот почему последние два отсутствуют. – CodenameLambda

Смежные вопросы