【问题标题】:How to slice a circular list iteratively ? (Python 2.7)如何迭代地切片循环列表? (Python 2.7)
【发布时间】:2020-05-08 11:29:58
【问题描述】:

我正在循环中对对象列表进行切片,但即使使用模索引,似乎也无法使切片环绕该列表的末端:

N = 4
nums = range(N) # [0, 1, 2, 3]

for i in xrange(N):
    print nums[i: (i+2)%N]

打印:

[0, 1]
[1, 2]
[]
[]

我怎样才能让它返回:

[0, 1]
[1, 2]
[2, 3]
[3, 0]

注意:我使用的是 Python 2.7,无法导入像 numpy 这样的模块

【问题讨论】:

  • 唯一会从该列表返回[3, 0] 的切片表示法需要step 参数:nums[3::-3]...

标签: python python-2.7 slice modulo


【解决方案1】:

或者尝试使用:

N = 4
nums = xrange(N)

for i in xrange(N):
    print (nums[i:(i+2)%(i+N)] + [0] * 2)[:2]

【讨论】:

    【解决方案2】:

    或者你可以这样做:

    N = 4
    nums = range(N)
    
    for i in xrange(N):
        print [nums[i], nums[(i+1)%N]]
    
    [0, 1]
    [1, 2]
    [2, 3]
    [3, 0]
    

    【讨论】:

      【解决方案3】:

      要制作“真正的”循环数字对,您应该合并一些itertools

      from itertools import cycle, islice, izip
      
      circ_list = izip(cycle(nums), islice(cycle(nums), 1, None))
      

      这是一个无限迭代器,它将不断产生您想要的各种数字对。

      cycle(nums) 将无休止地重复您的数字列表,islice(..., 1, None) 会跳过其中的第一项,因此您基本上拥有[0, 1, 2, ...][1, 2, 3, ...]izip 组合在一起。

      例如,您现在可以取一小部分:

      >>> list(islice(circ_list, 5))
      [(0, 1), (1, 2), (2, 3), (3, 0), (0, 1)]
      

      【讨论】:

      • 谢谢。到目前为止,这是正确解决切片部分的唯一答案。
      猜你喜欢
      • 2015-02-04
      • 1970-01-01
      • 2010-11-23
      • 2015-06-15
      • 2017-04-30
      • 1970-01-01
      • 2020-08-08
      • 2021-04-11
      相关资源
      最近更新 更多