2015-11-03 70 views
0

我的问题是这样的:创建重叠子集蟒蛇

举例来说,如果我们有一个数字,以名单为1至1200,如: 1,2,3,4,5,......,1200 我们如何提取一个特定的大小(可以说400)python中的以下块: 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 
+0

你可以用切片的符号我的解决方案:http://stackoverflow.com/questions/509211/

这可以在一个单一的线放解释-蟒蛇切片表示法。如果我了解你,就像[0:400]一样。 – alpert

+2

作为旁注:'[我为我在范围内(1200)]'→'列表(范围(1200))' – spectras

回答

1

,以应对子列表,使用然GED指数

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])) 
+0

我认为你的扩展失去了第一个0 - 400。为了显示第一个0-400的打印语句必须先到达 –

+0

@GiorgosPerakis啊是的,谢谢;我对显示如何使用范围更感兴趣... fixed –

+0

我们可以让这段代码“one_liner”吗? –

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

这是使用itertools.groupby

import itertools 

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