Python 避免';索引不在范围内';关于加密字符串块的嵌套循环

Python 避免';索引不在范围内';关于加密字符串块的嵌套循环,python,nested-loops,Python,Nested Loops,我是一名初级Python程序员 我有一个加密问题需要解决,我必须将一个字符串分成n个大小的块,然后将每个块的第一个索引添加到列表中,然后再添加每个块的第二个索引,等等。我有一个解决方案,当所有块都相等时,可以解决这个问题,但是,如果len(string)%n!=0当这种情况发生时,上面我用来向列表中添加字符的循环超出范围,程序无法工作。有什么解决办法吗 编辑 似乎我有点不清楚 加密采用字符串,例如“123456789”和数字,例如3。然后将字符串分成大小为n的块。所以新闻英语[123456789

我是一名初级Python程序员
我有一个加密问题需要解决,我必须将一个字符串分成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)]