2016-07-04 9 views
3

文字列に '....(((...')を入力してください。別の文字列 'ss(4)h5(3) SS(3)H 2(2)SS(3) 'シーケンスの文字数を生成する

は' SS 'と連続数 '' に対応する'。 'のブラケットである。

'(' に対応します' H5' とcontinuosの数 '(' ブラケットである。

現在、私は出力を得ることができるよ 'SS(4)H5(3)SS(3)' と私コードは、最後の2つの文字シーケンスを無視します。 これは私が所望の出力を得るためにコードを変更する方法

これまで

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の答えは、関数を自分で定義する場合しかし、あなたはこのようにそれを行うことができ、素晴らしいです:

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問題はありません。 Btw、あなたのコードの問題は、 "ss"と "h5"の文字列を出力に直接追加し、次のシーケンスが終了した場合だけではないということです。これが最後の2つが欠落している理由です。 – CodenameLambda

関連する問題