String um Element aus Liste ergänzen

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
rockst4rr277
User
Beiträge: 7
Registriert: Sonntag 18. Oktober 2020, 13:46

Hallo, ich bin neu im Thema Programmieren und brauche Hilfe.
Ich bastel einen Twitterbot und dieser soll einen Text mit einer fixen Anzahl an Zeichen (Beispiel: 102 Zeichen) um Elemente aus einer Liste mit verschiedener Zeichenanzahl (Beispiel: 15, 20, 16, 17, 21) ergänzen, bis die maximale Anzahl von 140 erreicht ist. Anschließend soll er den Text erneut ausgeben aber diesmal mit den nachfolgenden Elementen der Liste.
Zum besseren Verständnis noch ein Beispiel:

Text:
Hallo, guten Tag. Dies ist ein sehr schöner Beispieltext für mein Programmierprojekt. Ich wünsch noch einen schönen Tag!
# Dieser Beispieltext hat 120 Zeichen

Nun die Liste:
Die Liste hat Elemente, welche verschieden viele Zeichen haben:
[Wort1, Wort2, Wort3, Wort4, usw.]

Nun brauch ich einen Code der den Text um die Wörter der Liste ergänzt bis die 140 erreicht sind und dann erneut mit den Elementen der Liste die noch fehlen. Bps: (Text + Wort1, Wort2) <=140 Zeichen, (Text + Wort3, Wort4, Wort5)<= 140Z, (Text+ Wort6)<=140Z, (Text + W7, W8, W9, W10)<=140 usw.


Kann mir jemand helfen? Ich wäre wirklich sehr dankbar!
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ist schon spät, aber meine groben Gedanken dazu wären diese:

Code: Alles auswählen

from itertools import chain, combinations

TWEET_SIZE = 140

word_combinations = chain.from_iterable(
    combinations(words, r) for r in range(1, len(words) + 1)
)
offset = TWEET_SIZE - len(text)
candidates = [
    words for words in word_combinations
    if sum(map(len, words)) <= offset
]
Gute Nacht! :)
Benutzeravatar
__blackjack__
User
Beiträge: 13112
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@snafu: Ich denke Du hast ein Optimierungsproblem daraus gemacht was so (noch) gar nicht gefordert war. 🙂

Du hast das jetzt nicht berücksichtigt, vielleicht auch weil es nicht spezifiziert war, aber Du zählst da nur die Länge der Worte zusammen, ohne Platz für ein Leerzeichen dazwischen zu berücksichtigen. Da müsste rockst4rr277 noch mal nachlegen ob, und falls ja wie, die Worte getrennt werden sollen.

@rockst4rr277: Wie würdest Du denn vorgehen, wenn Du dieses Problem manuell lösen müsstest? Und das dann Schritt für Schritt für jemand anderen Beschreiben der nicht besonders schlau ist/nicht mitdenkt. Also zum Beispiel ein Rechner. 🙂

Bei der Implementierung könnte `more_itertools.peekable` hilfreich sein.

Und das ganze am besten in eine Funktion verpacken, damit man das testen kann. Das testen auch tatsächlich tun, am besten automatisiert. Und einer der Tests sollte bei den Worten eines enthalten das für sich alleine zusammen mit dem Präfixtext schon über der Maximallänge liegt, um zu schauen ob sich die Funktion damit korrekt verhält. Was auch immer korrekt in dem Fall bedeutet, denn dieser Fall wurde nicht spezifiziert.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
rockst4rr277
User
Beiträge: 7
Registriert: Sonntag 18. Oktober 2020, 13:46

@Snafu:
Ich danke dir wirklich von Herzen für deine Bemühungen, aber ich weiß nicht wo ich in deinem Code die Liste der Empfänger hab.
würdest du mir den noch mal um Text und Liste jeweils als input durch user erweitern?
Das wär super nett, weil dann kann ich damit auch was anfangen

@blackjack:
OK ich versuchs mal mit Pseudo-Programmiersprache ;)

Tweetsize = 140
Text = "Hallo, ich bin ein Text. Ich bin ein sehr schöner Text. Siehste doch."
Textlaenge = len(Text) # 69 Zeichen
Textübrig = Tweetsize - Textlaenge #<------ 140 - 69 = 71 Zeichen
Liste = susi@web.de, peter@gmail.com, yusuf@yahoo.de, ronald@mcdonals.com, michael@meyers.org, greta@wirrettendiewelt.yeah #115

Nimm Text und addiere so lange empfaenger aus liste bis 140 erreicht:

Hallo, ich bin ein Text. Ich bin ein sehr schöner Text. Siehste doch. susi@web.de, peter@gmail.com, yusuf@yahoo.de, ronald@mcdonals.com

#An dieser Stelle sind wir bei 135 Zeichen. Ergo müssen alle Empfänger die jetzt folgen in den nächsten Tweet gepackt werden. Bis die Liste abgearbeitet ist -->>>

Hallo, ich bin ein Text. Ich bin ein sehr schöner Text. Siehste doch. michael@meyers.org, greta@wirrettendiewelt.yeah


Ich hoffe ich konnte es einigermaßen verständlich machen?

PS: Empfaenger aus Liste immer mit Leerzeichen getrennt :)
Benutzeravatar
__blackjack__
User
Beiträge: 13112
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@rockst4rr277: Du bist am Anfang der Beschreibung sehr detailliert, das lässt dann aber nach. Das muss alles sehr detailliert beschrieben werden, denn Du musst das am Ende ja dem saudummen Rechner verklickern.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
rockst4rr277
User
Beiträge: 7
Registriert: Sonntag 18. Oktober 2020, 13:46

Ja wenns so einfach wäre, würde ich mir keine Hilfe in nem Forum suchen.
snafu war so nett mir zu helfen, allerdings weiß ich nicht wie man sein snippet jetzt einfügt und was man noch definieren muss :(
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Mein Snippet ist für die Lösung ungeeignet, da es alle Kombinationen von "Wörtern" (bzw Mail-Adressen) für eine bestimmte Restgröße in der Nachricht ermittelt. Du willst aber offenbar die vorgegebene Reihenfolge einhalten und die restlichen Adressen in weitere Tweets unterbringen. Bleibt denn dabei der Text (und somit die Textlänge) erhalten oder ändert sich das für die zusätzlichen Tweets?
Antworten