3

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

2 に答える 2

12

以下が機能するはずです。

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

これが機能する理由は 3 つあります。

  1. オフセットが 0 かどうかをチェックする必要はありません (0 の場合は最初から開始します)。

  2. selection[offset:None]offsetリストの最後から

  3. 三項演算子を使用すると、制限が整数の場合とそうでない場合に(limit + offset if limit else None)使用できます。(がリストの長さよりも大きいかどうかは問題ではないことに注意してください。デフォルトでは、リストの最後まで移動します)。limit + offsetNonelimit + offsetselection[10:100000000]

于 2013-02-05T01:02:51.040 に答える
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))
于 2013-02-05T01:22:31.880 に答える