按价值移动每个字母的单词

时间:2013-10-27 08:09:51

标签: python shift

创建一个名为shift

的函数

从用户获取值   阅读文件中的单词列表

按值将每个单词中的每个字母向右移动 这是我的问题的答案!自从我上次检查它以来已经很久了,但我的意思是,当我看到我的问题时,我笑了!我觉得更好!至少我越来越好了:p 这是为了帮助未来可能会问的人,但是你在这里仍然要去

•def shift():
    value=eval(input("Please enter the value here."))
    file = open("Passwords.txt","w")
    with open ("word-text.txt","r") as m:
        for line in m:
            line=line.strip()
            print (line)
            newString = ""
            for char in line:
                char_int=ord(char)
                t=char_int+value
                if t==124:
                    t = t-27
                charme= chr(t)
                print (char,">>",charme)
                newString += charme
            file.writelines(line+" "+newString+"\n")

3 个答案:

答案 0 :(得分:2)

你不必转换为ascii,你可以只使用maketrans函数

def shift_string(text, shift):
    intab='abcdefghijklmnopqrstuvwxyz'
    outab=intab[shift:]+intab[:shift]
    return maketrans(intab, outab)

答案 1 :(得分:1)

繁重的工作正在进行转换,所以我已经做到了 - 你可以做其余的事情,因为它非常微不足道。 :)

这可以通过将每个字符转换为数字表示并校正循环性能(即Z移位2将输出B)。

def limits_correction(character, distance, start, end):
    char = character
    if char >= start and char < end:
        if char + distance >= end:
            char = char + distance - 26
        else:
            char = char + distance
    return char


def modify_string(string, distance):
    ords = [ord(c) for c in string]

    corrected_distance = 0
    if distance > 26:
        corrected_distance = distance % 26
    elif distance > 0 and distance <= 26:
        corrected_distance = distance

    lower_start = 97
    lower_end = lower_start + 26
    upper_start = 65
    upper_end = upper_start + 26

    shifted_string = []

    for char in ords:
        if char >= lower_start and char < lower_end:
            char = limits_correction(char, corrected_distance, lower_start, lower_end)
        elif char >= upper_start and char < upper_end:
            char = limits_correction(char, corrected_distance, upper_start, upper_end)

        shifted_string.append(chr(char))

    return ''.join(shifted_string)

这也适用于任何整数移位数的大写和小写(从0到非常大)。

参考:

http://www.asciitable.com/

答案 2 :(得分:1)

你需要自己完成作业(或者学习编程没有意义),如果你不理解这个问题,你应该向老师要求澄清。

那就是说,原则上转变很简单。你可以手工完成。如果你有一个字母,比如说A,把它换成1(键= 1)会把它变成B.在作业中你移动2个位置,所以A会变成C,B(在原始单词中)会变成D等等。你必须要小心字母表的结尾。当移位1时,Z变为A.当移位2时,Y变为A而Z变为B.

所以在你的例子中,HELLO变成了JGNNQ,因为当转移2个位置时:

H =&gt; Ĵ

E =&gt; ģ

L =&gt; Ñ

O =&gt; Q

(注意:我使用大写字母表示可读性,但你的作业似乎是关于小写字符。我假设你只被要求处理小写字母。)

你是怎么做到的?查看您获得的链接。基本上ord()将一个字符转换为一个整数,chr()将一个这样的整数转换为一个字符。它基于字符在计算机中表示为数字的方式。因此,对于给定的字符,如果将其转换为ord(),则可以添加键以移动它,然后将其转换回带有chr()的字符。

对于从Y和Z到A和B的包装,你可以使用模数运算符(%),但要小心,它有点繁琐(你需要计算你的角色和ord之间的差异) 'a',应用%26(它给出0到25之间的数字),然后将其添加到ord('a)以获得正确的ord)。如果它过于复杂,只需使用几个IF即可。

我建议从一个小程序开始,该程序从用户获取输入并打印输出以检查它是否正常工作。您不需要输入并在最终版本中打印,但它可以帮助您测试您的移位代码是否正常工作。

然后你有关于从文件读取和写入文件的部分。您的作业不会要求用户输入,而是从文件中读取。您的行with open ("word-text.txt","r") as f:看起来很好,这应该为您提供读取数据所需的文件句柄。您可以使用f.read()读取数据并将其分配给变量。我不确定你曾经教过什么,但是我把这个字符串分成了<string>.split()的单词,它创建了一个字符串列表(你的单词)。

然后对于每个单词,使用您之前编写的代码来移动字符串,您只需将原始单词和移位的单词写入输出文件即可。最简单的可能是从打开输出文件开始(在写入模式下),并通过循环列表一次完成移位和写入。