2017-11-21 7 views
-1

文字列のリストと長さ制限Nが与えられました。次の文字列がNの制限を超えるまで、リストに連続した文字列を蓄積する関数を書く必要があります。リストのリストを返す必要があります。各リストは、合計でN文字を超えない最大の連続部分文字列です。 例については、以下のテストケースを参照してください。また、リスト内の単一の文字列がNより長い場合は、有用なメッセージを出力して返す必要があります。文字列のリストをサブリストに分割する方法len( ""。join(sublist))<= N?

def break_lst(lst, size): 
    def len_lst(l): 
     return len("".join(l)) 

    result = [] 
    sublst = [] 

    for i, v in enumerate(lst): 
     sublst.append(v) 
     ls = len_lst(sublst) 

     if ls == size: 
      result.append(sublst) 
      sublst = [] 
     elif ls > size: 
      prev_sublst = sublst[:-1] 
      if not prev_sublst or len_lst(prev_sublst) > size: 
       raise Exception("Error: use a bigger size than " + str(size)) 
      else: 
       result.append(prev_sublst) 
       sublst = [] 

    return result 

if __name__ == "__main__": 
    lst = ["1", "22", "333", "4444", "55555", "666666", "7777777", "88888888"] 

    for i in range(17): 
     try: 
      print(i, break_lst(lst, size=i)) 
     except Exception as e: 
      print(e) 

それはだ上記のコードだけではなく醜いだけでなく、バ​​ギー、それは私にこの出力与えている:

Error: use a bigger size than 0 
Error: use a bigger size than 1 
Error: use a bigger size than 2 
Error: use a bigger size than 3 
Error: use a bigger size than 4 
Error: use a bigger size than 5 
Error: use a bigger size than 6 
Error: use a bigger size than 7 
8 [['1', '22', '333'], ['55555'], ['7777777']] 
9 [['1', '22', '333'], ['55555'], ['7777777']] 
10 [['1', '22', '333', '4444'], ['55555'], ['7777777']] 
11 [['1', '22', '333', '4444'], ['666666']] 
12 [['1', '22', '333', '4444'], ['666666']] 
13 [['1', '22', '333', '4444'], ['666666', '7777777']] 
14 [['1', '22', '333', '4444'], ['666666', '7777777']] 
15 [['1', '22', '333', '4444', '55555'], ['666666', '7777777']] 
16 [['1', '22', '333', '4444', '55555']] 

予想される出力は次のようになります。

Error: use a bigger size than 0 
Error: use a bigger size than 1 
Error: use a bigger size than 2 
Error: use a bigger size than 3 
Error: use a bigger size than 4 
Error: use a bigger size than 5 
Error: use a bigger size than 6 
Error: use a bigger size than 7 
8 [['1', '22', '333'], ['4444'], ['55555'], ['666666'], ['7777777'], ['88888888']] 
9 [['1', '22', '333'], ['4444', '55555'], ['666666'], ['7777777'], ['88888888']] 
10 [['1', '22', '333', '4444'], ['55555'], ['666666'], ['7777777'], ['88888888']] 
11 [['1', '22', '333', '4444'], ['55555', '666666'], ['7777777'], ['88888888']] 
12 [['1', '22', '333', '4444'], ['55555', '666666'], ['7777777'], ['88888888']] 
13 [['1', '22', '333', '4444'], ['55555', '666666'], ['7777777'], ['88888888']] 
14 [['1', '22', '333', '4444'], ['55555', '666666'], ['7777777'], ['88888888']] 
15 [['1', '22', '333', '4444', '55555'], ['666666', '7777777'], ['88888888']] 
16 [['1', '22', '333', '4444', '55555'], ['666666', '7777777'], ['88888888']] 

任意の提案を?

+1

投稿を元の質問に戻してください。答えはもはや一致しません。あなたの新しい質問は、まったくそのように掲示されるべきです:新しい質問。 \t また、CodeReview.StackExchange.comに作業コードの改善が含まれています – Prune

+0

@Pruneええ、確かに、btw ...なぜ誰かがこの質問をd​​ownvoteでしたか?私が理解している限り、それは初心者レベルであっても、SOのルールに従っています:/ – BPL

+0

私はダウン投票者ではないので、わかりませんが、私は投票しないと考えました。 – Prune

答えて

2

問題は、このセクションにあります:あなたは次のリストは、所定の長さを超えていると判断しました

elif ls > size: 
     prev_sublst = sublst[:-1] 
     if not prev_sublst or len_lst(prev_sublst) > size: 
      raise Exception("Error: use a bigger size than " + str(size)) 
     else: 
      result.append(prev_sublst) 
      sublst = [] 

。あなたは1つの要素を適切にバックアップし、最大化されたサブリストを記録しました。しかし、あなたはではありません。は、あなたのサイズ制限を吹き込んだv要素の家を発見しました。

手始めに、あなたの新しいサブリストにそれを入れてみてください:

 else: 
      result.append(prev_sublst) 
      sublst = [v]  # <=== the change is here. 

を今、あなたのロジックをチェック - あなたは次のいずれかに反復する前に、この1項目のリストを検証したいと思います。あなたがiを使用しないとき

for i, v in enumerate(lst): 

一つの小さなコメントがなぜあなたはenumerateのトラブルに行きましたか?

関連する問題