带偏移和限制的数组切片

3 投票
2 回答
10231 浏览
提问于 2025-04-17 14:46

我正在把一些数据从SqlAlchemy的查询结果迁移到一个存储物品ID的缓存里。

我在想怎么处理那些带有限制和偏移量的迁移函数,找到最好的方法。

我下面的代码可以正常工作。但我有点担心,因为它用了7行代码。通常情况下,如果某个东西需要这么多行,可能是我没有看到更简单的方式,或者是我忘记了Python的一些知识,或者是我还没学到的东西。

def sampling( selection, offset=0 , limit=None ):
    if offset or limit:
        if limit is not None:
            limit = offset + limit        
        else:
            limit = len(selection)
        selection = selection[offset:limit]
    return selection

ids = range(1,100)
print sampling(ids,1,20)
print sampling(ids,10,20)
print sampling(ids,90)
print sampling(ids,90,300)

2 个回答

4
from itertools import islice
def sampling(selection, offset=0, limit=None):
    return islice(islice(selection, offset, None), limit)
def sampling(selection, offset=0, limit=None):
    return list(islice(islice(selection, offset, None), limit))

或者如果你需要一个列表,而不是一个可迭代的对象

13

下面的代码应该可以正常工作:

def sampling(selection, offset=0, limit=None):
    return selection[offset:(limit + offset if limit is not None else None)]

这个代码能正常工作的原因有三个:

  1. 不需要检查偏移量是否为0(如果是0,就从头开始取数据)

  2. selection[offset:None]表示从offset开始,一直到列表的末尾

  3. 三元运算符(limit + offset if limit else None)的意思是,如果limit是一个数字,就用limit + offset,如果不是,就用None。注意,即使limit + offset大于列表的长度也没关系。比如selection[10:100000000]会默认取到列表的末尾。

撰写回答