2015-01-08 3 views
1

Итак, я попытался сдвинуть одну букву вниз по шкале индекса, например 'a', становясь 'd', когда вы сдвинете ее '3', но теперь я хочу сделать целое слово, чтобы каждая буква сдвигаются вниз в то же время, вот что я до сих пор:Смещение целого слова вниз индекс

Alphabet=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] 
W=input("Enter Word: ") 
S=int(input("Please choose a number between -51 and 51: ")) 
I=(Alphabet.index(W)) 
J=I+S 
if J>25: 
print("Please choose a number that is between -51 and 51") 
else: 
print("Your code word is: ",Alphabet[J]) 

выход был:

Enter Word: today 
Please choose a number between -51 and 51: 3 
Traceback (most recent call last): 
File"C:/Users/Owner/OneDrive/Documents/Python/Word Shift.py", line 4, in <module> 
I=(Alphabet.index(W)) 
ValueError: 'today; is not in list 

FYI, я буквально новичок в Python, так что я не знаю много «Stuff», если не слишком много проблем, можете ли вы рассказать мне, где я поступил не так, и что делает каждая часть вашего кодированного решения?

+1

26 находится между -51 и 51, и вам нужно будет проиндексировать каждую букву не целое слово –

+0

Его, потому что вы пытаетесь f ind index «today» в списке Alphabet (вы можете изменить это на нижний регистр). Но в списке Алфавит нет его, что вызовет ошибку-значение. –

+0

Разве это не так очевидно? Вы пытались получить индекс «сегодня» в списке «Алфавит», который, конечно, не содержит слова «сегодня» внутри. – dragon2fly

ответ

1

some_list.index(element) поднимает ValueError, если element нет в some_list. Alphabet.index(W) выдает эту ошибку, если введенное слово не является одним символом, потому что Alphabet - это всего лишь список одиночных символов.

Вам нужно создать пустой список, перебрать символы в W, конвертировать каждый символ с помощью Alphabet.index и добавить к списку. После цикла вы используете идиом ''.join(some_list), чтобы объединить весь список в одну строку.

new_word_list = [] 
for char in W: 
    I = Alphabet.index(char) 
    new_word_list.append(Alphabet[I+S]) 
new_word = ''.join(new_word_list) 

Ваш код также не будет работать, потому что ваш Alphabet список состоит только из 26 элементов, но пользователь может ввести номер, который будет принимать индекс выше 26. Например, если кто-то выбрал номер 1 и 'z' был одним из символов, ваш код будет вызывать индексную ошибку, потому что Alphabet.index('z') составляет 26, и 27-го индекса нет.

Самое простое решение этого (хотя и не эффективно), чтобы сделать это, когда вы определяете Alphabet:

Alphabet=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']*3 

Это означает, что ваш список алфавит будет долго 78 элементов.

После того, как вы более комфортно с Python, вы можете захотеть взглянуть на встроенные функции, такие как chr, ord и содержание strings модуля, который упростит некоторые из вещей, которые вы пытаетесь сделать.

1
import string 

alphabet= string.ascii_lowercase # this is a string containing all lower-case characters 

valid_range= len(alphabet)-1 # calculate how far it's possible to shift characters 

word= input("Enter Word: ") # get a word to encode from the user 

while True: # get a valid shift from the user 
    try: 
     shift= int(input("Please choose a number between -{0} and {0}: ".format(valid_range))) 
    except ValueError: 
     print('You must enter a number') 
     continue 
    if -valid_range <= shift <= valid_range: 
     break 
    print('The number must be between -{0} and {0}'.format(valid_range)) 

def shift_chars(text, shift, alphabet): 
    # create a translation table: from_char -> to_char 
    # using the original and the shifted alphabet 
    trans_table= str.maketrans(alphabet, alphabet[shift:]+alphabet[:shift]) 
    # then use it to shift all characters 
    return text.translate(trans_table) 

code_word= shift_chars(word, shift, alphabet) 
print("Your code word is:", code_word) 

Пример:

Enter Word: abc 
Please choose a number between -25 and 25: 1 
Your code word is: bcd 
+0

Реквизиты для использования строковых функций 'lowercase',' maketrans' и «переводить», очень pythonic. Замечание: с помощью python 3 эти функции переместились в 'string.ascii_letters',' str.maketrans' и 'str.translate'. Потенциальное улучшение: обрабатывать символы верхнего регистра, добавляя их к алфавиту, а затем уменьшая пополам значение valid_range. ('string.ascii_letters' уже включает оба случая). – PeterE

+0

@PeterE: Не понял, что это был python 3, спасибо. –

+0

Я не объявлен как таковой. Я просто подумал, что это нужно упомянуть ради завершения. Но OP использует печать как функцию, а не как инструкцию. – PeterE

0

Ваша ошибка означает слово today нет в вашем списке Alphabet. Я бы использовал numpy, чтобы сделать вашу цель простым способом.

import numpy as np 

Alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 
      'v', 'w', 'x', 'y', 'z'] 

mask = np.array(Alphabet) # make a numpy array of string of anything in Alphabet 

W = raw_input("Enter a lowercase Word: ") 
S = int(raw_input("Please choose a number between -51 and 51: ")) 

mask=np.roll(mask, S) # shift the array to left or right `abs(S)` time 
dictionary = {x:y for x,y in zip(Alphabet, mask)} # make a dictionary to look up after 
new_word =''.join([dictionary[char] for char in W]) # make new word after looked up 
print new_word 

И это тест случай:

Enter Word: hello 
Please choose a number between -51 and 51: -3 
khoor 

В самом деле, количество не ограничено в пределах [-51, 51] диапазона. Вы можете попробовать любой номер. Время, в течение которого маска слова вращается, равна введенному числу. Если число положительное, маска поворачивается вправо и наоборот.

0

Как отметил @zehnpaard, ваша проблема заключается в том, что вы пытаетесь найти все слово в алфавите, и вам нужно найти все буквы отдельных лиц.Вы можете сделать это с помощью списка comphrehension:

indexes = [Alphabet.index(c) for c in word] 

Это даст вам:

>>> [Alphabet.index(c) for c in "hello"] 
[7, 4, 11, 11, 14] 

Теперь, что вы хотите сделать, это добавить номер, но вы хотите, чтобы сделать ваш массив циклическим, это достигается с помощью оператора mod (%), при условии, len(Alphabet) = 26shift = 15 и письмо t (индекс 19):

>>> (19 + 15) % 26 
8 

Там у вас есть свой гр ircular array, без необходимости тройного ввода. Это обобщается с другим списком понимания в следующем виде:

>>> n = len(Alphabet) 
>>> shift = ### whatever you get in the input 
>>> new_indexes = [(i+shift)%n for i in indexes] 

Вы получаете новые символы, глядя в алфавит:

>>> new_chars = [Alphabet[i] for i in new_indexes] 

И вы получите обратно свое слово, соединив символы:

>>> cipher_word = ''.join(new_chars) 

Весь этот процесс может выполняться в меньших количествах ... этот путь более ясен. Просто sumarize:

>>> word = "stackoverflow" 
>>> shift = 10 
>>> n = len(Alphabet) 
>>> indexes = [Alphabet.index(c) for c in word] 
>>> new_indexes = [(i+shift)%n for i in indexes] 
>>> new_chars = [Alphabet[i] for i in new_indexes] 
>>> cipher_word = ''.join(new_chars) 
>>> print cipher_word 
cdkmuyfobpvyg 
0
import string 

alphabet = list(string.ascii_lowercase) 

user_input = raw_input("Enter the code : ").lower() 

number = int(raw_input("Enter Number between -26 and 26 : ")) 

code = "" 

for i in range(len(user_input)): 

     alphabet[alphabet.index(user_input[i]) + number] 
     code = code + string.replace(user_input, user_input[i], alphabet[alphabet.index(user_input[i]) + number])[i] 

print "User code is : %s " % code 

--- Выход

Введите код: код

Введите число между -26 и 26: 5

код Пользователь: htij

+0

Думаю, вы можете отказаться от преобразования алфавита в список. Строка также индексируется. – PeterE

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