切片具有偏移和限制的数组

时间:2013-02-05 00:57:17

标签: python

我正在将一些数据从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 个答案:

答案 0 :(得分:7)

以下内容应该有效:

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 + offset,如果不是,则允许使用None。{li>

    (请注意,如果limit + offset大于列表的长度并不重要。selection[10:100000000]将默认上升到列表的末尾。

答案 1 :(得分:3)

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