Python - Auflistung aller Kombinationen mit Wiederholung

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
Thomas K.
User
Beiträge: 4
Registriert: Donnerstag 25. April 2024, 22:03

Hallo,

ich möchte gern alle Kombinationen zu einer 8stelligen Ziffernfolge mit Wiederholungen auflisten, auch z.B. die Ziffernfolge 11579910. Mit dem nachfolgenden Programmcode funktioniert das noch nicht, da die Wiederholungen nicht erfasst werden.


#open the file
text_file = open('/Users/Thomas/Kombinationen.txt','w')

# Python program to print all
# the possible combinations

from itertools import permutations

# Get all combination of [12345678]
# of length 3
comb = permutations([1,2,3,4,5,6,7,8], 8)

for i in comb:
print(i, file=text_file)


Wäre für eine Idee oder Verbesserung des Programmcodes dankbar.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Statt permutations brauchst du product aus itertools.
Sirius3
User
Beiträge: 17768
Registriert: Sonntag 21. Oktober 2012, 17:20

Importe stehen ganz am Anfang der Datei.
Dateien öffnet man mit dem with-Statement. Bei Text-Dateien sollte man auch immer das richtige Encoding angeben.
Variablennamen müssen aussagekräftig sein. Bei i denkt man an einen Index, eine einzelne Zahl, nicht an ein Tuple aus 8 Zahlen.
Was hat ein Kamm mit Kombinationen zu tun?
Kommentare sollten erklären, was gemacht wird und nicht das offensichtliche beschreiben. Vor allem sollten Kommentare dem Code wiedersprechen, wie zum Beispiel, alle Kombinationen der Länge 3, wenn Du eigentlich 8 möchtest.

Code: Alles auswählen

from itertools import product

with open('/Users/Thomas/Kombinationen.txt', 'w', encoding="utf8") as output:
    combinations = product([1,2,3,4,5,6,7,8], 8) 
    for combination in combinations:
        print(combination, file=output)
Thomas K.
User
Beiträge: 4
Registriert: Donnerstag 25. April 2024, 22:03

Vielen Dank an _deets_ und Sirius3

Ich erhalte bei dem Code von Sirius3 folgende Fehlermeldung:

Exception has occurred: TypeError
'int' object is not iterable

combinations = product([1,2,3,4,5,6,7,8],8)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: 'int' object is not iterable

Ich hatte versucht vor "product" noch ein "int" zu setzen, hat aber leider nicht funktioniert.

Was muss ich noch ändern bzw. hinzufügen?
Sirius3
User
Beiträge: 17768
Registriert: Sonntag 21. Oktober 2012, 17:20

So schnell geht's wenn man etwas nicht testet:

Code: Alles auswählen

product([1,2,3,4,5,6,7,8], repeat=8)
Thomas K.
User
Beiträge: 4
Registriert: Donnerstag 25. April 2024, 22:03

Alles gut, vielen Dank für die schnelle Antwort
Mein Code dagegen war eher der eines Anfängers gewesen und nicht wirklich strukturiert.
Hast du evtl. noch einen Tip, wie man Python noch besser lernen kann?
Thomas K.
User
Beiträge: 4
Registriert: Donnerstag 25. April 2024, 22:03

Kann man die Kombinationen auch aufteilen und in mehreren Dateien speichern? Die erstellte Datei lässt sich leider wegen der Größe nicht öffnen.
Sirius3
User
Beiträge: 17768
Registriert: Sonntag 21. Oktober 2012, 17:20

Was ist überhaupt der Sinn, alle Kombinationen in einer Datei zu speichern? Es ist deutlich effizienter, die Zahlen bei Bedarf zu erzeugen.
Benutzeravatar
__blackjack__
User
Beiträge: 13142
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Thomas K.: Na klar kann man das auch aufteilen in mehrere Dateien. Warum sollte man das nicht können?
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
nezzcarth
User
Beiträge: 1638
Registriert: Samstag 16. April 2011, 12:47

Du kannst die Teilung entweder gleich beim Erzeugen vornehmen oder nachträglich, z.B. mit dem Linux/Unix Kommandozeilen-Tool 'split'.

Wobei: Die Datei ist bei mir 401MB (LF) bzw. 416 MB groß (CRLF). Das kann ein geeigneter Editor auf einem handelsüblichen Rechner problemlos öffnen und darstellen. Z.B. Geany oder vim packen das bei mir problemlos und mit so etwas wie 'less' geht es ja eh "immer".
Benutzeravatar
grubenfox
User
Beiträge: 435
Registriert: Freitag 2. Dezember 2022, 15:49

oder mit Kate... dauert vielleicht einen mehr oder weniger kleinen Moment beim öffnen/einlesen, aber passt...
Benutzeravatar
__blackjack__
User
Beiträge: 13142
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Die Datei(en) werden auch kleiner wenn man nicht die Liste einfach ausgibt, sondern wie im ersten Beitrag die Ziffernfolge pro Zeile speichert. Also ohne Klammern, Kommas, und Leerzeichen.

Code: Alles auswählen

#!/usr/bin/env python3
from itertools import product

from more_itertools import ichunked


def main():
    for i, rows in enumerate(
        ichunked(product([1, 2, 3, 4, 5, 6, 7, 8], repeat=8), 0x400000)
    ):
        with open(f"test{i:02d}.txt", "w", encoding="ASCII") as file:
            file.writelines("".join(map(str, row)) + "\n" for row in rows)


if __name__ == "__main__":
    main()
Sind dann 36 MiB pro Datei, wenn man das auf vier Dateien aufteilt:

Code: Alles auswählen

$ ls -lh test0?.txt
-rw-rw-r-- 1 bj bj 36M Apr 28 14:21 test00.txt
-rw-rw-r-- 1 bj bj 36M Apr 28 14:21 test01.txt
-rw-rw-r-- 1 bj bj 36M Apr 28 14:21 test02.txt
-rw-rw-r-- 1 bj bj 36M Apr 28 14:21 test03.txt
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Antworten