【问题标题】:shift each letter of words by value按值移动单词的每个字母
【发布时间】:2013-10-27 08:09:51
【问题描述】:

我正在尝试从用户那里获取一个值并从 Passwords.txt 文件中读取一个单词列表,然后将每个字母按值向右移动

•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")

【问题讨论】:

  • 这里将一个字母右移k 表示下一个kth 字母。例如:h 右移 2 后变为 j
  • 堆栈溢出是您遇到问题时寻求帮助的地方。不要让你的工作免费完成。所以尝试自己做。如果您在某个时候遇到困难,请返回,向我们展示您做了什么,您将获得帮助。顺便说一句:如果你是编程新手,最好的办法就是编程!

标签: python shift


【解决方案1】:

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

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

【讨论】:

  • 您应该使用string.maketrans 而不是maketrans。你也可以intab = string.printable
【解决方案2】:

你需要自己做作业(或者学习编程没有意义),如果你不明白这个问题,你应该问你的老师澄清。

也就是说,换档原则上非常简单。你可以用手来做。如果你有一个字母,比如 A,将其移动 1(key = 1)会将其转换为 B。在作业中,您移动 2 个位置,因此 A 将变为 C,B(在原始单词中)将变为 D等等。你必须小心字母表的结尾。移位 1 时,Z 变为 A。移位 2 时,Y 变为 A,Z 变为 B。

因此,在您的示例中,HELLO 变为 JGNNQ,因为移动 2 个位置时:

H => J

E => G

L => N

O => Q

(注意:我使用大写字母是为了便于阅读,但您的作业似乎是关于处理小写字符。我假设您只被要求处理小写字母。)

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

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

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

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

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

【讨论】:

  • 这正是我所需要的,我需要一个解释,而不是有人为我编写整个代码,那么上课没有意义,但是,我不太确定,为什么我在挣扎有时候老师让我做一些功能,有时候不知道用什么,是不是新手程序员的通病?
  • @user2924427:不知道要使用哪个功能对于初学者来说并不少见——这就是经验和学习发挥作用的地方。要点是不断练习和阅读——这样才能变得更好。
  • 我会记住这一点,而不是你给我的很好的解释:)
  • 如果我的回答对您有帮助,请点赞,我需要代表 :) 当您遇到这样的问题需要做很多事情时,请将其分解为更小、更易于管理的步骤。不要忘记您可以在 python shell 中试验新功能,例如输入ord('a') => 你得到 97,然后chr(97) => 你得到'a'。确保您了解问题 - 提出问题。熟悉 python 的文档,尤其是标准库。作为初学者,您需要的大部分内容都是内置函数和内置类型。
【解决方案3】:

繁重的工作是进行单词转换,所以我已经完成了 - 您可以完成其余的工作,因为它非常简单。 :)

这通过将每个字符转换为数字表示并纠正循环性能来工作(即,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/

【讨论】:

  • 尽量不要把栈溢出变成作业写服务;对于明确的家庭作业,最好提供提示
  • @BurhanKhalid:我不希望这样,但是考虑到系统的设计(即更高的声誉可以让一个人访问更多的工具),如果想要这样的访问,就会发生这种情况:@987654322 @。另外,在这里和那里帮助别人是件好事,而且有时通过尝试一些东西,你也能学到东西。 :) 不过,感谢您的反馈 - 我以后会记住的。 :)
  • @user2924427:如果内置的意思是在 Python 中定义的函数,那么可以。如果您指的是我创建和使用的函数,那么我创建这些函数只是为了简化问题的抽象。更简单的代码在阅读时更容易理解。而且,通过distance,您的猜想是正确的:它是向右移动(即正向)的字母数:例如:a 移动2c。如你所愿。而且,不客气。
猜你喜欢
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-05
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多