Получить случайную перестановку слова, отличного от слова - PullRequest
0 голосов
/ 29 февраля 2020

Я хотел бы получить случайную перестановку букв слова, , если возможно , иначе само слово.

Как это можно сделать эффективно ?

Это то, что у меня сейчас есть

from itertools import permutations
import random

word = 'some_word'
permutations = [''.join(permutation) for permutation in permutations(word)]
random.shuffle(permutations)
scrambled_word = word
for permutation in permutations:
    if permutation != word:
        scrambled_word = permutation
        break

По сути, я просто получаю первую перестановку всех перестановок слова. Я буду делать эту операцию для многих слов, и я считаю этот метод неэффективным. В общем, не нужно получать все перестановки данного слова.

Я имел в виду, что у меня может быть итерация случайных перестановок, из которой я могу просто извлечь первую перестановку. Как это можно сделать в Python? Функция permutations из itertools является итеративной, но элементы расположены не в случайном порядке. Мне нужна перестановка random , чтобы она не выглядела как оригинальное слово.

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

Как указано в документации для random.shuffle, вы можете использовать random.sample:

scrambled_word = ''.join(random.sample(word, k=len(word)))

Это не помешает вам время от времени возвращать исходное слово, поскольку это действительная перестановка. Если вы не разрешите оригинал, вы не получите действительно случайную выборку. Вы можете отфильтровать оригинал, если хотите; просто попробуйте еще раз, если вам не нравится слово, которое вы получили (убедитесь, что вы обнаружили случай, когда все буквы одинаковы):

def scramble(word):
  while True:
    scrambled_word = ''.join(random.sample(word, k=len(word)))
    if scrambled_word != word or all(c == word[0] for c in word):
      return scrambled_word
0 голосов
/ 29 февраля 2020

Просто чтобы добавить к ответу @ rici. Этот код проверит, состоит ли слово только из одной буквы.

КОД:

word = "aaa"

while True:
    scrambled_word = ''.join(random.sample(word, k=len(word)))
    if word.count(word[0]) == len(word) or scrambled_word != word:
        break
print(scrambled_word)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...