繁体   English   中英

Python,在范围内遍历列表

[英]Python, loop through list within a range

我有一个值为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:交互式外壳中的示例用法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM