Python,遍历范围内的列表

时间:2013-02-22 23:23:04

标签: python

我有一个值为0到30的列表。

如何使用添加的偏移量循环这些值(在一个范围内)?

由于这可能没有任何意义,我已经做了一个小图:

diagram

5 个答案:

答案 0 :(得分:4)

这处理环绕式案例

def list_range(offset, length, l):
    # this handles both negative offsets and offsets larger than list length
    start = offset % len(l)
    end = (start + length) % len(l)
    if end > start:
        return l[start:end]
    return l[start:] + l[:end]

编辑:我们现在处理负面索引案例。

编辑2:交互式shell中的示例用法。

>>> l = range(30)
>>> list_range(15,10,l)
[15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
>>> list_range(25,10,l) # I'm guessing the 35 in the example was accidental
[25, 26, 27, 28, 29, 0, 1, 2, 3, 4]
>>> list_range(-8,10,l)
[12, 13, 14, 15, 16, 17, 18, 19, 20, 21]

编辑3:更新为忽略每条评论的-8,10个案例

编辑4:我正在使用列表切片,因为我怀疑它们比循环数据更有效。我只是测试了它,我的预感是正确的,它比mVChr的版本快2倍,它循环在列表上。然而,这可能是一个不成熟的优化,更多的pythonic答案(列表理解单行)在你的情况下可能会更好

答案 1 :(得分:2)

除了最后一个具有负偏移的情况外,这将适用于所有情况:

[(i + offset) % max_range for i in xrange(count)]

# e.g.
max_range = 30
count = 10
offset = 15
print [(i + offset) % max_range for i in xrange(count)]
# [15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
offset = 25
print [(i + offset) % max_range for i in xrange(count)]
# [25, 26, 27, 28, 29, 0, 1, 2, 3, 4]

这应该让你走上正轨,但我不确定如何最好地处理最后一个案例。

答案 2 :(得分:0)

难道你不能说

List = range(30)
newList = []
for i in range(n):
    newList.append(List[n+offset])

这不是一般的,但应该适用于示例文件中列出的情况。

答案 3 :(得分:0)

def loopy(items, offset, num):
    for i in xrange(num):
        yield items[(offset + i) % len(items)]


>>> x = range(30)
>>> print list(loopy(x, 25, 10))
[25, 26, 27, 28, 29, 0, 1, 2, 3, 4]

答案 4 :(得分:0)

好吧,让我们假设您有一个列表,以获取新列表

list=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
newlist=[]
#let's say I want 5 through 10
for n in range(5,11):
   newlist.append(list[n])

新列表将是5到10.对于做循环的数字使用否定,就像 范围(-1,4)将给你15,0,1,2,3,4