Python 避免';索引不在范围内';关于加密字符串块的嵌套循环
我是一名初级Python程序员Python 避免';索引不在范围内';关于加密字符串块的嵌套循环,python,nested-loops,Python,Nested Loops,我是一名初级Python程序员 我有一个加密问题需要解决,我必须将一个字符串分成n个大小的块,然后将每个块的第一个索引添加到列表中,然后再添加每个块的第二个索引,等等。我有一个解决方案,当所有块都相等时,可以解决这个问题,但是,如果len(string)%n!=0当这种情况发生时,上面我用来向列表中添加字符的循环超出范围,程序无法工作。有什么解决办法吗 编辑 似乎我有点不清楚 加密采用字符串,例如“123456789”和数字,例如3。然后将字符串分成大小为n的块。所以新闻英语[123456789
我有一个加密问题需要解决,我必须将一个字符串分成n个大小的块,然后将每个块的第一个索引添加到列表中,然后再添加每个块的第二个索引,等等。我有一个解决方案,当所有块都相等时,可以解决这个问题,但是,如果len(string)%n!=0当这种情况发生时,上面我用来向列表中添加字符的循环超出范围,程序无法工作。有什么解决办法吗 编辑
似乎我有点不清楚
加密采用字符串,例如“123456789”和数字,例如3。然后将字符串分成大小为n的块。所以新闻英语[123456789]。然后将第一个元素从newStringList[0]移到newStringList[n-1],然后移到第二个元素,依此类推。按顺序排列的列表[1,4,7,2,5,8,3,6,9]。现在,您对上述问题有了更好的背景 这里有一种简单的字符串分块方法,它不介意最后一个分块是否太短:
for i in range(n):
for j in range(o):
orderedList.append(newStringList[j][i])
例如:
def ChunkString( string, n=8 ):
return [ string[ i:i+n ] for i in range( 0, len( string ), n ) ]
另一种可能适用于加密上下文的方法是在进入前填充每个字符串,以便其长度可以被n
整除:
>>> ChunkString('123456789')
['12345678', '9']
以下是一些示例输出:
def PadString( string, n=8, padChar='*' ):
return string + padChar * ( -len( string ) % n )
更新问题的解决方案如下所示:
>>> PadString('1')
'1*******'
>>> PadString('1234567')
'1234567*'
>>> PadString('12345678')
'12345678'
在最后一行之前添加一个if条件将修复该问题。if条件是确保仅当元素存在时才访问数组列表
chunks = ChunkString( '12345678', 3 )
from itertools import izip_longest, chain
reordered = chain( *izip_longest( *chunks ) )
print( [ x for x in reordered if x is not None ] )
范围(n)内的i的:
对于范围(o)内的j:
如果j
有多个选项:
1) 请求原谅,又称原谅。使用:
2) 将绳子垫到合适的长度:
for i in range(n):
for j in range(o):
try:
orderedList.append(newStringList[j][i])
except IndexError:
break
3) 使用奇特的方法:
对于Python 2.7:
if not len(inputStr) % n:
inputStr += '*' * (n - len(inputStr) % n)
对于Python 3.x:
a = [[1,2,3],[4,5,6],[7,8]]
orderedList = [filter(None,x) for x in itertools.izip_longest(*a)]
-> [(1, 4, 7), (2, 5, 8), (3, 6)]
此方法使用函数(Python 2.7用i拼写)自动将多个列表压缩并填充。我已经有了一个函数,可以将它分割成我想要的块。就在我使用循环添加索引中最后一个较小块中的元素时range@PFOD1998您可以使用
itertools.izip\u longest
和itertools.chain
-请参见编辑。这只是给了我一个空白列表,我在上面添加了更多信息,如果这有助于比较运算符错误的话。使用j@Jasper啊哈!工作完美,是比上述异常更好的解决方案。非常感谢这个例外非常有效谢谢你。我在班上还没有学过,所以我很高兴你的帮助
a = [[1,2,3],[4,5,6],[7,8]]
orderedList = [filter(None,x) for x in itertools.izip_longest(*a)]
-> [(1, 4, 7), (2, 5, 8), (3, 6)]
a = [[1,2,3],[4,5,6],[7,8]]
orderedList = [list(filter(None,x)) for x in itertools.zip_longest(*a)]
-> [(1, 4, 7), (2, 5, 8), (3, 6)]