Сделайте каждую возможную перестановку слов, используя только один список - PullRequest
0 голосов
/ 27 марта 2020

Я пока не очень много знаю о кодировании (работаю над ним), и я впервые пользуюсь этим сайтом, но не совсем впервые, когда использую такой, как этот (так что go легко для меня, смеется), и я подумал, что это будет лучшее место, чтобы спросить. Итак, то, что я сейчас пытаюсь сделать sh, пытается сделать возможной каждую перестановку с одним набором слов любой возможной длины, не повторяя одно и то же слово в одном результате. Я не смог найти ничего подобного, так как большинство из того, что я видел, что люди делают или хотят, имеют какой-то предел, когда они делают наборы только с определенным количеством слов c в каждом вместо всех возможных длин, для Например, если есть пять слов, я хочу, чтобы в результатах было все возможное количество слов в наборе, то есть я хочу, чтобы в нем были множества с одним, двумя, тремя, четырьмя и пятью словами, и, конечно, каждая возможная перестановка с этими наборами ,

В качестве примера: каждое число представляет собой количество слов в наборе (которое он должен автоматически найти для каждой длины) должно начинаться с одного слова в наборе и заканчиваться пятью словами в каждом наборе. набор, никогда не повторяя одно и то же слово в одном наборе:

1

Alpha
Beta
Charlie
Delta

2

Alpha Beta
Alpha Charlie
Alpha Delta
Beta Alpha
Beta Charlie
Beta Delta
Charlie Alpha
Charlie Beta
Charlie Delta
Delta Alpha
Delta Beta
Delta Charlie

3

Alpha Beta Charlie
Alpha Beta Delta
Alpha Charlie Beta
Alpha Charlie Delta
Alpha Delta Beta
Alpha Delta Charlie
Beta Alpha Charlie
Beta Alpha Delta
Beta Charlie Alpha
Beta Charlie Delta
Beta Delta Alpha
Beta Delta Charlie
etc.
.
.
.

4

Alpha Beta Charlie Delta
Alpha Beta Delta Charlie
Alpha Charlie Beta Delta
Alpha Charlie Delta Beta
Alpha Delta Beta Charlie
Alpha Delta Charlie Beta
Beta Alpha Charlie Delta
Beta Alpha Delta Charlie
Beta Charlie Alpha Delta
Beta Charlie Delta Alpha
Beta Delta Alpha Charlie
Beta Delta Charlie Alpha
etc.
.
.
.

Также я не хочу делать это более смешным, но был бы способ, которым я мог бы отфильтровать все линии, только что сделанные линии, и вытащить только те, которые имеют вхождение c в их? В качестве примера, потяните только те строки, в которых есть альфа, поэтому, если у меня есть:

Alpha Beta
Alpha Charlie
Alpha Delta
Beta Alpha
Beta Charlie
Beta Delta
Charlie Alpha
Charlie Beta
Charlie Delta
Delta Alpha
Delta Beta
Delta Charlie

Я могу просто специально взять:

Alpha Beta
Alpha Charlie
Alpha Delta
Beta Alpha
Charlie Alpha
Delta Alpha

Так что да, это в основном то, что я пытаюсь сделать здесь, 1028 *, и из того, что я видел, никто еще этого не делал или, по крайней мере, никогда не просил об этом, и я надеюсь, что это не требует слишком многого здесь. Заранее благодарю за любую помощь, которую вы можете оказать, и особенно спасибо, если вы можете дать мне код или ссылку на тот, который может сделать все это.

1 Ответ

0 голосов
/ 27 марта 2020

В python, itertools.permutations возвращает фиксированные перестановки длины набора вещей, таких как список имен. Легко написать собственный генератор для запуска permutations для каждой длины, которую вы хотите.

import itertools

words = ["Alpha", "Beta", "Charlie", "Delta"]

def combos(collection):
    """Return all permutations of a collection from length 1 to 
    total length of the collection.
    """
    for r in range(1, len(collection) + 1):
        yield from itertools.permutations(collection, r)

for row in combos(words):
    print(" ".join(row))

Это дает (с пробелами)

Alpha
Beta
...
Alpha Beta
Alpha Charlie
...
Alpha Beta Charlie
Alpha Beta Delta
…
Alpha Beta Charlie Delta
Alpha Beta Delta Charlie
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...