2017-11-21 6 views
-1

Ich habe eine Liste von Strings und eine Längenbeschränkung N gegeben. Ich muss eine Funktion schreiben, um aufeinanderfolgende Strings in der Liste zu sammeln, bis der nächste String den Grenzwert N überschreiten würde. Ich muss eine Liste von Listen zurückgeben, wobei jede Liste die größte zusammenhängende Teilkette ist, die N Zeichen insgesamt nicht überschreitet. Siehe den folgenden Testfall für ein Beispiel. Wenn eine einzelne Zeichenfolge in der Liste länger als N ist, muss ich eine nützliche Nachricht drucken und zurückkehren.Wie man die Liste der Zeichenfolgen in Unterlisten aufteilt, in denen len ("". Join (Unterliste)) <= 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) 

Der obige Code nicht nur hässlich, sondern auch fehlerhaft, es gibt mir diese Ausgabe:

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']] 

Wenn die erwartete Ausgabe sein sollte:

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']] 

Jeder Vorschlag?

+1

Bitte stellen Sie den Beitrag auf die ursprüngliche Frage zurück; Die Antwort stimmt nicht mehr überein. Deine neue Frage sollte genau das gepostet werden: eine neue Frage. \t Auch die Verbesserung der Arbeitscode gehört in CodeReview.StackExchange.com – Prune

+0

@ Prune Ja, sicher, BTW ... Warum hat jemand diese Frage abgelehnt? Soweit ich es verstehe, folgt SO Regeln, auch wenn es Newbie-Ebene ist ...:/ – BPL

+0

Ich weiß es nicht, da ich nicht der Down-Voter bin. Allerdings habe ich Down-Voting wegen der nicht beschreiben Ich habe eine Beschreibung geschrieben, die hoffentlich dieses Problem behebt. – Prune

Antwort

2

Das Problem ist in diesem Abschnitt:

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 = [] 

Sie festgestellt haben, dass die nächste Liste die angegebene Länge überschreitet. Sie haben ein Element ordnungsgemäß gesichert und die maximierte Unterliste aufgezeichnet. Allerdings haben Sie nicht ein Zuhause für die v Element gefunden, das nur Ihre Größenbeschränkung blies.

Für den Anfang, versuchen Sie es in Ihrem neuen sublist setzen:

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

Nun überprüfen Sie Ihre Logik - Sie haben eine Artikelliste überprüfen möchten, bevor Sie auf die nächste Iteration.

Ein kleiner Kommentar über

for i, v in enumerate(lst): 

Warum Sie sich die Mühe enumerate ging, wenn Sie nie i benutzen?

Verwandte Themen