我试图在每次循环运行时将字符串的字母移过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
它给我一个错误,说
属性错误:&#39; str&#39;对象没有属性&#39; set&#39;
就像我说的那样,每次分配一个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所以任何帮助都很受欢迎。
答案 0 :(得分:1)
这是一种旋转字符串中字符的方法,假设字符串中只有A-Z字母。
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.这是modulo(%)进来,如果需要,它会将字母Z移回A.
输出:
BCDEFGHIJKLMNOPQRSTUVWXYZA
CDEFGHIJKLMNOPQRSTUVWXYZAB
DEFGHIJKLMNOPQRSTUVWXYZABC
EFGHIJKLMNOPQRSTUVWXYZABCD
FGHIJKLMNOPQRSTUVWXYZABCDE
GHIJKLMNOPQRSTUVWXYZABCDEF
HIJKLMNOPQRSTUVWXYZABCDEFG
IJKLMNOPQRSTUVWXYZABCDEFGH
JKLMNOPQRSTUVWXYZABCDEFGHI
KLMNOPQRSTUVWXYZABCDEFGHIJ
答案 1 :(得分: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