0

每次运行while循环时,我都试图将字符串的字母移动1(因此“A”变为“B”,“B”变为“C”,以此类推)。

我需要显示每个结果,以便我可以比较它们。我不想做但知道如何做的是创建 26 个不同的函数,每个函数将字母移动一个字母,但这似乎有点荒谬。

每次 while 循环通过时,如何为 ttk 分配一个变量?

我认为这会将“ls”加上计数(ls1,ls2,ls3 ...)分配给每个变量,但事实并非如此。它每次都会抛出一个错误。

def shift1(*args):
    s = code.get()
    storage = []
    count = 1
    while (count <= 26):
        l = [ord(i) for i in s]
        sh = ([chr(i + count) for i in l])
        storage.append(sh)
        ("ls"+str(count)).set(storage(count - 1))
        count += 1

它给了我一个错误,上面写着

AttributeError:“str”对象没有属性“set”

就像我说的,每次分配一个 diff ttk 变量时,我可以只使用这个函数 26 次。

def shift1(*args):
    s = code.get()
    l = [ord(i) for i in s]
    sh1.set(''.join([chr(i + 1) for i in l]))

这基本上会绕过循环,但我知道必须有更好的方法。python 和 ttk 非常新,所以任何帮助表示赞赏。

4

2 回答 2

1

这是一种旋转字符串中字符的方法,假设字符串中只有 AZ 字母。

string = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for i in range(10):
    string = "".join([chr((ord(letter) - ord('A') + 1) % 26 + ord('A')) for letter in string])
    print string

这个想法是每个字母与字母 A 的 ASCII 码不同。所以字母 A 为 0,字母 B 为 1。当字母 Z 向前移动时,它需要回到 A。这就是模 (% ) 进来时,如果需要,它会将字母 Z 移回 A。

输出:

BCDEFGHIJKLMNOPQRSTUVWXYZA
CDEFGHIJKLMNOPQRSTUVWXYZAB
DEFGHIJKLMNOPQRSTUVWXYZABC
EFGHIJKLMNOPQRSTUVWXYZABCD
FGHIJKLMNOPQRSTUVWXYZABCDE
GHIJKLMNOPQRSTUVWXYZABCDEF
HIJKLMNOPQRSTUVWXYZABCDEFG
IJKLMNOPQRSTUVWXYZABCDEFGH
JKLMNOPQRSTUVWXYZABCDEFGHI
KLMNOPQRSTUVWXYZABCDEFGHIJ
于 2013-09-05T01:19:33.023 回答
1

您不需要使用while循环,只需使用 for 循环进行迭代即可。与 Bemmu 的回答一样,这会强制字符全部大写,因为它更容易。但是您可以进行更多修改,以便根据大写或小写字符进行检查。

def shift(str):
    str =str.upper()
    for i in range(26):

        print "".join([chr((ord(x)-65+i)%26+65) for x in str])

shift("hello")

您可以在此处查看此操作:http: //codepad.org/OaBXM4s2

于 2013-09-05T01:22:10.910 回答