Почему при l oop работает для одного объекта, но не для массива объектов? - PullRequest
0 голосов
/ 04 февраля 2020

Хорошо, я здесь скремблирую слова и хочу сохранить скремблированный массив вместе с исходным массивом слов.

Первоначально я создаю свой массив:

randomwords = ['pepper', 'lightning', 'bored', 'teeth', 'floor', 'special', 'coffee', 'dopamine']

Затем для шифрования:

for j in range(len(randomwords)):
    word = randomwords[j] # original
    newword = ''
    for i in range(len(word)):
        newchar = random.choice(word)
        while(newchar in newword):
            newchar = random.choice(word)
        newword = newword[:i]+str(newchar)+newword[i:]
    shuffledwords.append(newword)

Это работает для первого слова, или если у меня только 1 объект в массив, но с несколькими заморозками Pycharm. Я не знаю, что происходит.

Создаю ли я бесконечное l oop как-нибудь?

EDIT Мне нужно сделать это вручную, без использования shuffle

Я сейчас пытаюсь с индексами, но все еще имеет бесконечное число l oop:

for j in range(len(randomwords)):
    word = randomwords[j] # original
    newword = ''
    indices = []
    for i in range(len(word)):
        newchar = random.choice(word)
        while(word.index(newchar) in indices):
            newchar = random.choice(word)
        indices.append(word.index(newchar))
        newword = newword[:i]+str(newchar)+newword[i:]
    shuffledwords.insert(j, word)

Ответы [ 3 ]

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

Я думаю, что у вас есть бесконечный l oop.

newchar = random.choice(word)

, случайным образом выбирающий букву в word.

Если word содержит повторяющиеся буквы, то newword будет содержать все буквы в word до того, как ваш for i in range(len(word)) l oop будет завершен. Это создаст бесконечное число l oop с while (newchar in newword)

Рассмотрим «перец»:

Представьте, что в первых трех итерациях вы выбрали «p», «r» и «e». for i l oop еще не завершено, но newchar = random.choice(word) всегда будет выбирать символ уже в newword

Я бы попытался создать список букв в слове, которое вы скремблируете, и затем случайным образом удаляя одну букву за раз из этого списка, пока она не станет пустой.

========================= ============================================

Позднее редактирование, но хотел покажи 1 способ сделать это вручную ....

import random

randomwords = ['pepper', 'lightning', 'bored', 'teeth', 
               'floor', 'special', 'coffee', 'dopamine']
shuffledwords = []

for j in range(len(randomwords)):
    word = randomwords[j] # original word to scramble

    newword = '' #scrambled word
    num_letters = len(word) #original number of letters in word

    for i in range(num_letters):
        # pick raandom letter from those still in word
        curr_idx = random.randrange(len(word))
        newchar = word[curr_idx]
        #print (newchar)

        # remove chosen letter from original word
        if curr_idx == 0:
            word = word[1:]
        elif curr_idx == len(word)-1:
            word = word[0:-1]
        else:
            word = word[0:curr_idx] + word[curr_idx+1:]

        # Add chosen letter to scrambled word
        newword = newword[:i]+str(newchar)+newword[i:]
    #print(newword)
    shuffledwords.append(newword)
0 голосов
/ 04 февраля 2020

Это зашифрует слова и все символы внутри каждого слова.

import random
randomwords = ['pepper', 'lightning', 'bored', 'teeth', 'floor', 'special', 'coffee', 'dopamine']
randomwords = random.sample(randomwords,len(randomwords))
new_word = ""
for word in randomwords:
    word1 = random.sample(word, len(word))
    new_word = new_word + ''.join(word1) + " "
print(new_word)

Результат: "gnhinligt folor lesacpi prpepe ediaopmn hteet ecffoe edorb"

0 голосов
/ 04 февраля 2020

Это должно сделать это для вас!

import random
randomwords = ['pepper', 'lightning', 'bored', 'teeth', 'floor', 'special', 'coffee', 'dopamine']

def scrmble(var):
    scrbled=var[:]
    random.shuffle(scrbled)
    return (scrbled)


newlist = scrmble(randomwords)

print(randomwords, newlist)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...