1

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

如何通过添加偏移量循环遍历这些值(在一个范围内)?

因为这可能没有任何意义,所以我做了一个小图:

图表

4

5 回答 5

5

这处理环绕的情况

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 的答案(单行列表理解)可能会更好

于 2013-02-22T23:32:15.497 回答
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]

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

于 2013-02-22T23:36:26.390 回答
0

你不能说

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

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

于 2013-02-22T23:30:12.610 回答
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]
于 2013-02-22T23:37:07.250 回答
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。对于循环使用负数的数字,例如 range(-1,4) 会给你 15,0,1,2,3,4

于 2013-02-22T23:37:12.357 回答