2015-02-12 6 views
1
def make_new_words(start_word): 
    """create new words from given start word and returns new words""" 
    new_words=[] 
    for letter in start_word: 
     pass  
     #for letter in alphabet: 
     #do something to change letters 
     #new_words.append(new_word) 

У меня есть ввод слов с тремя буквами, например, автомобиль, который является стартовым словом. Затем мне нужно создать новое слово, заменив одну букву за раз каждой буквой из алфавита. Используя мой примерный автомобиль, я хочу создать слова, aar, bar, car, dar, ear, ..., zar. Затем создайте слова car, cbr, ccr, cdr, cer, ..., czr. Наконец caa, cab, cac, cad, cae, ..., caz.Создайте новые слова из начала слова python

Я не знаю, как должен выглядеть цикл for. Я думал о создании какого-то алфавитного списка и прокручивании этого, создавая новые слова, но я не знаю, как выбрать, какие части исходного слова должны оставаться. Новые слова могут быть добавлены к списку, который нужно вернуть.

ответ

3
import string 

def make_new_words(start_word): 
    """create new words from given start word and returns new words""" 
    new_words = [] 
    for i, letter in enumerate(start_word): 
     word_as_list = list(start_word) 
     for char in string.ascii_lowercase: 
      word_as_list[i] = char 
      new_words.append("".join(word_as_list)) 

    return new_words 
+0

Возможно, вы захотите изменить 'string.lowercase' на' string.ascii_lowercase' – Jkdc

0
import string 
all_letters = string.ascii_lowercase 
def make_new_words(start_word): 
    for index, letter in enumerate(start_word): 
     template = start_word[:index] + '{}' + start_word[index+1:] 
     for new_letter in all_letters: 
      print template.format(new_letter) 
0

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

for index in enumerate(start_word): 
    for let in range(ord('a'), ord('z')+1): 
     new_words.append(start_word[:index] + chr(let) + start_word[index+1:]) 
1

lowercase это просто строка, содержащая строчные буквы ...

Мы хотим изменить каждую букву оригинальное слово (здесь w), поэтому мы перебираем по буквам w, но нам больше всего нужен указатель букв, поэтому мы делаем цикл for на enumerate(w).

Прежде всего, в питоне строках являются неизменными, так мы строим список x из w ... списков изменяемые

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

Потому что мы хотим, чтобы напечатать строку, а не символов в списке, мы используем join метод нулевой строки '', что склеиваются элементы x используя, конечно, пустая строка.

Я не сообщил о выходе, но это именно то, что вы просили, просто попробовать ...

from string import lowercase 

w = 'car' 
for i, _ in enumerate(w): 
    x = list(w) 
    for s in lowercase: 
     x[i] = s 
     print ''.join(x) 
0

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

Это также звучит так, будто вы можете ограничить его только словами, которые существуют в словаре в какой-то момент, что является целым рядом червей.

Но сейчас, для трехбуквенных слов, вы попадаете на что-то в нужную дорожку, хотя я волнуюсь, что вопрос может быть слишком специфичным для переполнения стека.

Во-первых, вы, вероятно, иметь больше успеха, если цикл по индексу для этого слова, а не буквы:

alphabet = 'abcdefghijklmnopqrstuvwxyz' 
for i in range(len(start_word)): 

Затем вы можете использовать slice, чтобы захватить письма до и после того, как индекс ,

for letter in alphabet: 
    new_word = start_word[:i] + letter + start_word[i + 1:] 

Предлагается другой подход, который передает строку в список. Это связано с тем, что python будет запрещать просто установку start_word[i] = letter, which you can read about here.

Смежные вопросы