Alle möglichen aufeinander folgenden Kombinationen einer Liste anzeigen.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Jenny1277
User
Beiträge: 1
Registriert: Mittwoch 3. Oktober 2018, 07:36

Hallo ihr lieben,

habe ein Verständnisp Problem mit der Lösung. Ich soll einen Code schreiben der mir alle möglichen Kombinationen von 5 aufeinander folgenden Wörter einer Liste anzeigt. Habe auch den Beitrag von Dookie gelesen und stimme dem zu! Erwarte von keinem hier, das er meine Hausaufgaben macht. Ich will es verstehen. Nur hapert es ein wenig mit der Logik bei mir.

BSP: Liste (apfel, milch, honig. zucker, wasser, kaffee, tee, mehl, salz, limo, brombeere, limette, erdbeer, pflaume, gurke, birne, kirsche) usw. Liste ist ca 300 Wörter.

Beim ersten Durchlauf wäre das die Ausgabe Index(0,1,2,3,4).
Beim zweiten Durchlauf dann Index(1,2,3,4,5) usw. Das ist mit meinem jetzigen Code auch kein Problem. Nun kommt das Problem: Wie verdammt nochmal bekomme ich dann die Kombinationen Index(0,2,4,6,8) angezeigt und wenn die Range durchgelaufen ist, dann wird es ganz kompliziert. Wie lass ich eine Schleife laufen die Index(10,30,30,30,30) oder Index(10,20,20,20,20) anzeigt. Es geht halt nicht darum jedes Wort mit jedem zu kombinieren. Sondern nur Reihenfolgen zu erzeugen die mit der Liste von 300 Wörtern insgesamt möglich sind. Versuche mich nun mit einer verschachtelten Schleife aber da kommt nur Käse bei raus :( Vll hat einer von euch Profis einen Gedankenblitz für mich :D. Ich verzweifel schon...
Mein jetziger Stand: erst war die innere Schleife. Damit bekomme ich den Bereich List(0,1,2,3,4) List(1,2,3,4,5) usw. Nun versuche ich eine äußere Schleife einzusetzen, die mir einen erweiterten Zählerwert gibt. Hoffe ihr versteht mich :D

Liebe Grüße Jenny

Code: Alles auswählen

#!usr/bin/env python
from __future__ import absolute_import, division, print_function

open_file = open("1.txt", "r")
stri= ""

for line in open_file:
    stri+=line 
word_stri = stri.split()
la = 0
m = 0
for la in range(1,10):
    m = m + 1
    for i in range(0,5):
        print (word_stri[la],sep='',end=' ')
        la = la + m
    print('\n')
Benutzeravatar
__blackjack__
User
Beiträge: 13112
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Jenny1277: Also mir ist nicht klar was Du eigentlich haben willst, denn IMHO widerspricht sich da einiges. Warum willst Du Index(0,2,4,6,8) angezeigt bekommen? Das sind ja keine aufeinanderfolgenden Wörter‽

Nehmen wir mal an die Wörter müssen entgegen Deiner Aussage nicht aufeinanderfolgend sein, warum dann nach den ganzen tatsächlich aufeinanderfolgenden dann als nächstes Index(0,2,4,6,8)‽ Da sind ja plötzlich Zweierschritte bei den Indexwerten. Warum nicht Index(0,2,3,4,5) oder Index(0,1,2,3,5)? Und was ist mit Index(10,30,30,30,30)? Das willst Du haben? Da kommt ein Wort dann ja viermal vor, was auch die Bedingung mit aufeinanderfolgenden Worten verletzt.

Mach doch einfach mal ein kleines Beispiel komplett von Hand. Zum Beispiel sieben Worte und dann schreib mal alle Kombinationen auf die da im Ergebnis vorkommen sollen. Dann haben wir ein eindeutiges, komplettes Beispiel, und Du bekommst beim systematischen Aufschreiben dieser Ergebnisse vielleicht auch eine Idee wie Du das machst. Denn das Programm muss das am Ende ja auch machen.

Ansonsten empfehle ich einen Blick in das `itertools`-Modul, wo vielleicht schon die passende Funktion für Dich vorhanden ist, oder zumindest Bausteine dafür.

`stri` und `word_stri` und `la` sind übrigens Beispiele für sehr schlechte Namen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
nezzcarth
User
Beiträge: 1635
Registriert: Samstag 16. April 2011, 12:47

Jenny1277 hat geschrieben: Mittwoch 3. Oktober 2018, 08:02 Es geht halt nicht darum jedes Wort mit jedem zu kombinieren.
Das stimmt, allerdings kann es in manchen Fällen trotzdem eine vertretbare Lösung sein, so anzufangen und dann in einem zweiten Schritt die Ergebnisse zu filtern. Mit Generatoren geht das in Python vergleichsweise elegant. Beispielsweise war es mir so in kurzer Zeit möglich, alle Kombinationen aus deiner verkürzten Liste zu generieren, bei denen die Elemente in der Ausgangsliste jeweils einen kleineren Index haben als das nächste Element und das Ergebnis ist sofort da. Das wäre dann die Brute-Force-Variante, die mit einem passenden Algorithmus natürlich nicht mithalten kann, in der praktischen Anwendung aber manchmal akzeptable Resultate liefert, wenn der Problemraum nicht zu groß ist.
Antworten