将字符串中的每个字符更改为字母表中的下一个字符

时间:2016-06-05 15:47:18

标签: python string python-2.7

我在Ubuntu上使用PyCharm在Python 2.7中进行编码。

我正在尝试创建一个函数,该函数将接受一个字符串并将每个字符更改为字母表中的下一个字符。

read

当我运行代码时,我收到以下错误:

bufferedReader

我在第11行做什么?如何在每个字符的字母表中输入以下字符并将其附加到新列表?

非常感谢。

8 个答案:

答案 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'))