Wygenerowanie każdej możliwości ciągu słów ze słownika

1

Witam,
Czy istnieje rozwiązanie które wygeneruje mi z pliku słów (około 2000 słów - każde w nowej linii) zestaw każdej dostępnej możliwości złożonej z tych słów?
Interesuje mnie wygenerowanie WSZYSTKICH wariantów z użyciem tych słów w każdej kombinacji (docelowo po trzy słowa). Ciężko mi określić jak wiele czasu zajęłoby utworzenie takiego pliku z zestawem po 3 słowa na linię, to zależnie od tego (jeżeli w miarę krótko) chciałbym powtórzyć tą funkcję dla zestawu po sześć słów. Proszę o info czy i jaka byłaby możliwość wykonania tego?

Dodam jeszcze, że wyjściowy format byłby również w .txt i w każdej linii ciąg trzech słów

2

Istnieje Możliwych wariacji z powtórzeniami po 3 słowa z 2000 jest 2000^3, czyli 8000000000. Jeśli założymy że każde słowo ma ~10 liter i to wszystko 1 bajtowe ascii to taka lista będzie zajmować 8*32 = 256GB
Dla 6 słów masz 2000^6 = 64000000000000000000 czyli przy podobnych założeniach 2048000000000GB = 2048000 PB

Dla porównania CERNowe data center przetwarza jakiś 1PB danych dziennie, więc potrzebowałbyś zaledwie 5610 lat żeby wygenerować sobie taką listę :)

edit: byłoby trochę mniej gdyby np. inteteresowały cię jedynie kombinacje, albo chociaż wariacje bez powtórzeń

0

Bez powtórzeń ewentualnie mogłoby być... A ten "krótki odcinek czasu" który podałeś dotyczy wersji z trzema słowami? :)

1

Nawet bez powtórzeń to wiele nie zmieni ;)
Wariant z 3 słowami to jest, tak jak napisałem wyżej, 256GB czystego tekstu. Na szybko, generacja czegoś takiego z PyPy dla 2 słów to ~1s, więc dla 3 słów powinno być 2000 razy dłużej, jakieś 33 minuty. Każde kolejne słowo wydłuża proces 2000 razy, więc już dla 4 słów byłoby to ponad 1000h czyli 40 dni, ale nie ma sie co przejmować bo nie miałbyś gdzie tych danych sobie zapisać.

import codecs


def main():
    input_file_name = "in.txt"
    output_file_name = "out.txt"
    with codecs.open(input_file_name, "r") as input_file:
        words = input_file.read().split("\n")
    with codecs.open(output_file_name, "w") as output_file:
        for a in words:
            for b in words:
                for c in words:
                    output_file.write("%s %s %s\n" % (a, b, c))


main()

0

Wielkie dzięki dobry człowieku! Zaraz sprawdzę czy funga :)

0

Działa, ale nie do końca... finalny efekt wygląda tak:

slowoA slowoA slowoC 

Słowa się nie mogą powtórzyć i wystąpić dwa razy w jednej linii
Ogólnie do będzie to dobre :-) i zaskoczę Ciebie bo generowało się to chyba niecałe 5 minut w takiej formie. Gdyby przypadkiem znalazła się jeszcze wolna chwila i zaopatrzyłbyś to w jakiś pasek postępu to poza tym że się odwdzięczę jakoś - to będę wiedział dokładnie jak długo to trwa :P

JUŻ TERAZ i tak bardzo wdzięczny jestem

0

W Pythonie jest coś takiego jak funkcja permutations z modułu itertools, może tego użyć?
https://docs.python.org/3/library/itertools.html#itertools.permutations

jeszcze jest combinations
https://docs.python.org/3/library/itertools.html#itertools.combinations

0

Moim zdaniem powinieneś użyć iterools.combinations.

0

@Zbigniew Radiowski: ale czy ty chcesz podciagi czy podzbiory? Tzn czy A B C to dla ciebie inne rozwiazanie niż B A C i chcesz mieć oba w swoich wynikach?

import codecs
import itertools


def main():
    input_file_name = "in.txt"
    output_file_name = "out.txt"
    with codecs.open(input_file_name, "r") as input_file:
        words = input_file.read().split("\n")
    with codecs.open(output_file_name, "w") as output_file:
        for combination in itertools.combinations(words, r=3):
            for permutation in itertools.permutations(combination):
                output_file.write("%s %s %s\n" % permutation)


main()
0

Shalom A B C to inne rozwiązanie od B A C, ale nie ma możliwości powtórzenia słowa z tym samym ciągu (nie może być A A C, A C C itd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1