创建重叠的子集python

时间:2015-11-03 12:14:38

标签: python chunks

我的问题是:

例如,如果我们有一个从1到1200的数字列表,如: 1,2,3,4,5,......,1200 我们如何在python中提取特定大小(比方说400)以下块: 1-400,200-600,400-800,600-1000,800-1200

到目前为止我所做的是:

a = [i for i in range(1200)]
swift_number = 400
num1 = 0
num2 = num1 + swift_number
while (len(a) - num1) > swift_number:
    print "getting numbers from %s to %s", num1, num2
    num1 = num2 - swift_number / 2
    num2 = num1 + swift_number

3 个答案:

答案 0 :(得分:2)

利用切片表示法,可以简化很多:

a = list(range(1200))
swift_number = 400          # how many items per chunk
step = int(swift_number/2)  # how many items we shift for each chunk

chunks = [
    a[base:base+swift_number]
    for base in range(0, len(a), step)
]

这使chunks成为列表列表。第一个列表有[0..399]个项目,第二个列表有项目[200..599],第三个列表有项目[400..799]等等。

这可以放在一行:

chunks = [a[base:base+swift_number] for base in range(0, len(a), step)]

答案 1 :(得分:1)

为了解决子列表,请使用范围索引

x=[10, 20, 30, 40, 50, 60]
y=x[2:4] ## evaluates to [30, 40, 50]

所以你的代码看起来像是:

a=list(range(1, 1200+1))
width=400
for slice in range(2*len(a)/width - 1):
   index=slice*width/2
   print("%s" % (a[index:index+width]))

答案 2 :(得分:1)

这是我使用itertools.groupby

的解决方案
import itertools

[list(g) for _, g in itertools.groupby(xrange(1, 1201), lambda x: not(x % 400))]