例如,给定一个列表1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8
和一个数字4,它返回一个长度为4的列表的列表,即(1, 2, 3, 4), (5, 6, 7, 8), (1, 2, 3, 4), (5, 6, 7, 8)
。
基本上,我想在PowerShell中实现以下Python代码。
s = 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8
z = zip(*[iter(s)]*4) # Here N is 4
# z is (1, 2, 3, 4), (5, 6, 7, 8), (1, 2, 3, 4), (5, 6, 7, 8)
下面的脚本返回17而不是5。
$a = 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,0
$b = 0..($a.Length / 4) | % { @($a[($_*4)..($_*4 + 4 - 1)]) }
$b.Length
9条答案
按热度按时间2uluyalo1#
这是一个有点旧,但我想我会扔在方法,我用来分割数组成块。可以将Group-Object与构造的属性一起使用:
$groups
将是GroupInfo对象的集合;在本例中,每个组将正好有100个元素(可访问为$groups[0].Group
、$groups[1].Group
等)。我为计数器使用了一个对象属性,以避免-Property脚本块中的作用域问题,因为简单的$i++
不会写回原始变量。或者,您可以使用$script:counter = 0
和$script:counter++
,在没有自定义对象的情况下获得相同的效果。kpbpu0082#
2009年PowerShell Split-Every Function
也许可以改进。
p4rjhz4m3#
uinbv5nw4#
使用
select
提供解决方案。它不需要担心$list.Count
是否能被$chunkSize
整除。输出:
ui7jx7zq5#
@Shay Levy回答:如果你把a的值改为1..15,那么你的解决方案就不再起作用了(Peter Reavy评论)
这对我很有效:
x4shl7ld6#
我不知道为什么要在
(
后面加逗号。umuewwlo7#
zu0ti5jz8#
一个简单的方法,使用
List<T>
来收集输入对象元素并输出,而不使用$PSCmdlet.WriteObject
进行枚举。这与Windows PowerShell 5.1兼容。用途:
如果使用PowerShell 7+,一种更简单的方法是使用LINQ的
Enumerable.Chunk
。jei2mxaa9#
如果集合足够大(例如数以百万计的元素),则性能可能很重要。首先,从性能的Angular 来看,以前提出的解决方案都没有让我满意。以下是我的解决方案:
用法示例:
输出:
业绩计量:
输出:
140.467
(毫秒)