我在Ubuntu上使用PyCharm在Python 2.7中进行编码。
我正在尝试创建一个函数,该函数将接受一个字符串并将每个字符更改为字母表中的下一个字符。
read
当我运行代码时,我收到以下错误:
bufferedReader
我在第11行做什么?如何在每个字符的字母表中输入以下字符并将其附加到新列表?
非常感谢。
答案 0 :(得分:3)
我认为你这太复杂了。
只需使用modulo滚动到字符串的开头:
from string import ascii_letters
s='abcxyz ABCXYZ'
ns=''
for c in s:
if c in ascii_letters:
ns=ns+ascii_letters[(ascii_letters.index(c)+1)%len(ascii_letters)]
else:
ns+=c
如果您愿意,可以减少到一条不可读的行:
''.join([ascii_letters[(ascii_letters.index(c)+1)%len(ascii_letters)]
if c in ascii_letters else c for c in s])
无论哪种情况,
Turns abcxyz ABCXYZ
into bcdyzA BCDYZa
如果您希望将其限制为小写字母的上限,只需更改导入:
from string import ascii_lowercase as letters
s='abcxyz'
ns=''
for c in s:
if c in letters:
ns=ns+letters[(letters.index(c)+1)%len(letters)]
else:
ns+=c
答案 1 :(得分:2)
两件主要的事情。 1)不要使用Python内置的str
来定义变量,因为它可能导致异常行为。 2)for letter in range(len(str))
根本不返回一个字母(因此错误表明0不在您的列表中)。相反,它会逐个返回数字,直到str
的长度。相反,您可以使用for letter in my_string
。
编辑:请注意,您无需将字符串转换为字母列表。 Python会自动将字符串分解为for letter in strng
中的单个字母。根据linus的评论更新了答案。
def LetterChanges(strng):
ab_st = list(string.lowercase)
output_string = []
for letter in strng:
if letter == 'z':
output_string.append('a')
else:
letter_index = ab_st.index(letter) + 1
output_string.append(ab_st[letter_index])
new_word = "".join(output_string)
return new_word
# keep this function call here
print LetterChanges(raw_input())
答案 2 :(得分:1)
您要解决的问题是Ceaser密码。您可以在代码中实现公式。
E(x)=(x + n)%26,其中x是您的文本,n是移位。
下面是我的代码。 (我用python 3编写了代码)
import ast
n = ast.literal_eval(input())
n1 = n[0]
step = n[1]
def enc_dec(string,step):
result = ''
for i in string:
temp = ''
if i=='':
result = result+i
elif i.isupper():
temp = chr((ord(i) + step - 65) % 26 + 65)
else:
temp = chr((ord(i) + step - 97) % 26 + 97)
result = result + temp
return result
print(enc_dec(n1,step))
答案 3 :(得分:0)
代码存在两个问题。因为你正在调用range(len(str))
,所以不是循环字母而是循环数字。第二个问题是,在循环内,您将字符串分配给new_word
,这将导致下一次迭代失败,因为string
没有方法append
。如果您进行以下更改,则应该有效:
for letter in str: # for letter in range(len(str)):
if letter == "z":
new_word.append("a")
else:
new_word.append(ab_st[str.index(letter) + 1])
# new_word = "".join(new_word)
new_word = "".join(new_word)
答案 4 :(得分:0)
请看这个以简化代码的想法。
def LetterChanges(word):
zabc = 'abcdefghijklmonpqrstuvwxyzabc'
ab_st = list(zabc)
new_word = []
for letter in list(word.lower().strip()):
new_word.append(ab_st[zabc.index(letter) + 1])
new_word = "".join(new_word)
return new_word
LetterChanges(" Chicago ")
答案 5 :(得分:0)
这是我的代码我觉得很简单
def LetterChanges(st):
index = 0
new_word = ""
alphapet = "abcdefghijklmnopqrstuvwxyzacd"
for i in st.lower():
if i.islower(): #check if i s letter
index = alphapet.index(i) + 1 #get the index of the following letter
new_word += alphapet[index]
else: #if not letter
new_word += i
return new_word
print LetterChanges(raw_input())
答案 6 :(得分:0)
这是一种更通用的方法,用户可以选择要前后移动多少个字符以及要使用哪些字母:
from string import (ascii_lowercase,
ascii_uppercase)
from typing import Sequence
def shift(string: str,
*,
alphabets: Sequence[str] = (ascii_lowercase, ascii_uppercase),
step: int = 1) -> str:
"""Shifts `string` by `step` in `alphabets`"""
def shift_char(char):
for alphabet in alphabets:
try:
return alphabet[(alphabet.index(char) + step) % len(alphabet)]
except ValueError:
pass
return char
return ''.join(map(shift_char, string))
用法示例:
# default parameters
>>> shift('abcxyz, ABCXYZ')
'bcdyza, BCDYZA'
# negative shift
>>> shift('abcxyz, ABCXYZ',
step=-1)
'zabwxy, ZABWXY'
# using other alphabets
>>> russian_alphabet = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя'
>>> shift('уегнп гбзмюсзм',
alphabets=[russian_alphabet])
'фёдор двинятин'
性能说明:
请注意,alphabet[(alphabet.index(char) + step) % len(alphabet)]
是 O(n),这是因为要搜索字符串中元素的索引。对于小字符串来说可以,但是对于大字符串,最好有一个字典将字母中的每个字符映射到其索引,例如:
mapping = dict(map(reversed, enumerate(alphabet)))
答案 7 :(得分:0)
通过查找而不是对每个字母使用index
,可以更轻松,更有效地完成此操作。
look_up = dict(zip(string.ascii_lowercase, string.ascii_lowercase[1:]+'a'))
上面的zip
创建的形式为('a', 'b')...
的元组包括('z', 'a')
。将其馈送到dict
构造函数中将形成相同形式的字典。
所以现在代码可以很简单:
def LetterChanges(s):
from string import ascii_lowercase
look_up = dict(zip(ascii_lowercase, ascii_lowercase[1:]+'a'))
new_s = ''
for letter in s:
new_s += look_up[letter]
return new_s
即使是这种dict的创建,也可以通过使用str.maketrans
方法并将其结果提供给str.translate
来保存循环:
def LetterChanges(s):
from string import ascii_lowercase
return s.translate(str.maketrans(ascii_lowercase, ascii_lowercase[1:]+'a'))