jam*_*lak 63

>>> x = [1,2,3,4,5,6,7,8,9]
>>> zip(*[iter(x)]*3)
[(1, 2, 3), (4, 5, 6), (7, 8, 9)]
Run Code Online (Sandbox Code Playgroud)

如何zip(*[iter(s)]*n)在Python 中工作?

  • 请注意,这会丢弃不完整的块.如果你用`x = [1,2,3,4,5,6,7]`尝试它,那么你只得到两个块,并且丢弃`7`.(当然,这可能是你想要的,但如果不是,请小心!) (26认同)
  • 解释一下:P (3认同)
  • 这非常聪明,但我猜它是pythonic. (2认同)

the*_*olf 15

如果你真的想要子元素是列表与元组:

In [9]: [list(t) for t in zip(*[iter(range(1,10))]*3)]
Out[9]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Run Code Online (Sandbox Code Playgroud)

或者,如果要包含将被截断的左侧元素zip,请使用切片语法:

In [16]: l=range(14)

In [17]: [l[i:i+3] for i in range(0,len(l),3)]
Out[17]: [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13]]
Run Code Online (Sandbox Code Playgroud)


Aka*_*all 9

你也可以numpy.reshape在这里使用:

import numpy as np

x = np.array([1,2,3,4,5,6,7,8,9])

new_x = np.reshape(x, (3,3))
Run Code Online (Sandbox Code Playgroud)

结果:

>>> new_x
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
Run Code Online (Sandbox Code Playgroud)


shi*_*iva 7

>>> map(None,*[iter(s)]*3)
[(1, 2, 3), (4, 5, 6), (7, 8, 9)]
Run Code Online (Sandbox Code Playgroud)

  • @jamylak,实际上,这与你的代码有些不同.看看`map(无,*[iter(范围(10))]*3))`vs`zip(*[iter(range(10))]*3)`的结果.由于OP未指定他或她想要的行为,因此该答案是有效的. (4认同)