带偏移和限制的数组切片
我正在把一些数据从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)]
这个代码能正常工作的原因有三个:
不需要检查偏移量是否为0(如果是0,就从头开始取数据)
selection[offset:None]
表示从offset
开始,一直到列表的末尾三元运算符
(limit + offset if limit else None)
的意思是,如果limit
是一个数字,就用limit + offset
,如果不是,就用None
。注意,即使limit + offset
大于列表的长度也没关系。比如selection[10:100000000]
会默认取到列表的末尾。