我目前正在尝试在python中编码转置密码。但是我已经达到了我陷入困境的程度。
我的代码:
key = "german"
length = len(key)
plaintext = "if your happy and you know it clap your hands, clap your hands"
Formatted = "".join(plaintext.split()).replace(",","")
split = split_text(formatted,length)
def split_text(formatted,length):
return [formatted[i:i + length] for i in range(0, len(formatted), length)]
def encrypt():
我使用它来计算字符串的长度,然后使用长度来确定在程序中创建的列数。所以它会创造这个:
GERMAN
IFYOUR
HAPPYA
NDYOUK
NOWITC
LAPYOU
RHANDS
CLAPYO
URHAND
S
这是知道我陷入困境的地方。因为我想让程序通过将列组合在一起来创建一个字符串。所以它会组合每一列来创建:
IHNNLRCUSFADOAHLRYPYWPAAH .....
我知道我需要某种循环但不确定如何告诉程序创建这样的字符串。
感谢
答案 0 :(得分:1)
您可以使用字符串的切片以6(长度)
的步长获取字符串的每个字母print(formatted[0::length])
#output:
ihnnlrcus
然后循环遍历range(length)
中所有可能的起始索引并将它们全部链接在一起:
def encrypt(formatted,length):
return "".join([formatted[i::length] for i in range(length)])
请注意,这实际上并未使用split_text
,而是直接使用formatted
:
print(encrypt(formatted,length))
使用split_text
的问题然后你不能使用像zip
这样的工具,因为它们在第一个迭代器停止时停止(因为最后一个组只有一个字符,你只能得到它来自zip(*split)
)的一个小组
for i in zip("stuff that is important","a"):
print(i)
#output:
("s","a")
#nothing else, since one of the iterators finished.
为了使用类似的东西你必须重新定义zip的工作方式,允许一些迭代器完成并继续直到所有这些完成:
def myzip(*iterators):
iterators = tuple(iter(it) for it in iterators)
while True: #broken when none of iterators still have items in them
group = []
for it in iterators:
try:
group.append(next(it))
except StopIteration:
pass
if group:
yield group
else:
return #none of the iterators still had items in them
然后您可以使用它来处理分割数据,如下所示:
encrypted_data = ''.join(''.join(x) for x in myzip(*split))