整个单词向下移动索引

时间:2015-01-08 11:15:59

标签: python python-3.x

所以我试图将一个字母转移到索引范围内,例如' a'成为' d'当你改变它的时候,但是现在我想做一个完整的单词,这样每个字母都会同时向下移动,这就是我到目前为止所做的:

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

仅供参考,我实际上是蟒蛇的初学者,所以我不太了解很多&#34; Stuff&#34;,如果不是太麻烦你能不能告诉我去哪了错误以及编码解决方案的每个部分是做什么的?

5 个答案:

答案 0 :(得分: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号和&#39; z&#39;是其中一个字符,你的代码会抛出索引错误,因为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

这意味着您的Alphabet列表将长达78个元素。

一旦您对Python感到满意,您可能希望查看内置函数,例如chrordstrings模块的内容,这将简化你想要做的一些事情。

答案 1 :(得分: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

答案 2 :(得分: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]范围内。您可以尝试任何一个号码。单词掩码旋转的时间等于输入的数字。如果数字为正,则掩码向右旋转,反之亦然。

答案 3 :(得分:0)

正如@zehnpaard指出的那样,你的问题是你试图在字母表中找到整个单词,你需要做的就是找到所有的个人字母。你可以使用list comphrehension来做到这一点:

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

这会给你:

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

现在,您要做的是添加一个数字,但是您希望使数组循环,这是使用mod(%)运算符实现的,假设为len(Alphabet) = 26,{{1} }和字母shift = 15(索引19):

t

你有圆形阵列,无需重复三次。这通过以下形式的另一个列表理解来概括:

>>> (19 + 15) % 26
8

通过查看字母表来获得新的字符:

>>> 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]

所有这些过程都可以用更少的线来完成......这种方式更清晰。只是为了sumarize:

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

答案 4 :(得分: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

---输出

输入代码:code

在-26到26:5之间输入数字

用户代码是:htij