【问题标题】:Create overlapping subsets python创建重叠子集python
【发布时间】:2015-11-03 12:14:37
【问题描述】:

我的问题是这样的:

例如,如果我们有一个从 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

【问题讨论】:

标签: python chunks


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这是我使用itertools.groupby的解决方案

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

    【讨论】:

      【解决方案3】:

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

      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 - 400。或者不是?为了显示第一个 0 -400,打印语句必须先出现
      • @GiorgosPerakis 啊,是的,谢谢;我更感兴趣的是展示如何使用范围...固定
      猜你喜欢
      • 2011-01-29
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多