我有一个值为 0 到 30 的列表。
如何通过添加偏移量循环遍历这些值(在一个范围内)?
因为这可能没有任何意义,所以我做了一个小图:
这处理环绕的情况
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 的答案(单行列表理解)可能会更好
这将适用于所有情况,除了您最后一个具有负偏移量的情况:
[(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]
这应该会让你走上正确的轨道,尽管我不确定如何最好地处理最后一个案例。
你不能说
List = range(30)
newList = []
for i in range(n):
newList.append(List[n+offset])
这不是超级通用的,但应该适用于示例文件中列出的情况。
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]
好的,假设您有一个列表,以获取您的新列表
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