10

n が 0 の場合、シーケンスの最後の n 個の項目を操作しなければ[-n:]ならないことがよくn == 0あります。例えば

if len(b): 
    assert(isAssignableSeq(env, self.stack[-len(b):], b))
    newstack = self.stack[:-len(b)] + a
else: #special code required if len=0 since slice[-0:] doesn't do what we want
    newstack = self.stack + a

私の質問は、厄介な特別なケーシングを必要とせずにこの動作を取得する方法はありますか? 常に 0 をチェックする必要がなければ、コードははるかに単純になります。

4

5 に答える 5

16

orの合体動作を使用するだけです。

>>> print 4 or None
4
>>> print -3 or None
-3
>>> print -0 or None
None
于 2012-07-05T04:45:14.830 に答える
16

L[-2:]からに切り替えることができます。L[len(L)-2:]

>>> L = [1,2,3,4,5]
>>> L[len(L)-2:]
[4, 5]
>>> L[len(L)-0:]
[]
于 2012-07-05T04:51:13.260 に答える
2

コンストラクトを複数回使用していることに気付いた場合は、それを関数に変換します。

def last(alist, n):
    if n:
        return alist[:-n]
    return alist

newstack = last(self.stack, len(b)) + a

コメントの EOL で提案されているさらに単純なバージョン:

def last(alist, n):
    return alist[:-n] if n else alist[:]
于 2012-07-05T04:51:43.190 に答える
0

二重反転のおかげで、これは恐ろしく非効率的である可能性がありますが、インデックス作成を容易にするためにシーケンスを反転するという考えに何かがあることを願っています:

a = [11, 7, 5, 8, 2, 6]

def get_last_n(seq, n):
    back_seq = seq[::-1]
    select = back_seq[:n]
    return select[::-1]

print(get_last_n(a, 3))
print(get_last_n(a, 0))

戻り値:

[8, 2, 6]
[]
于 2012-07-05T04:52:10.640 に答える
0

そこに条件を入れることができます

L[-i if i else len(L):]

このバージョンはあまり明確ではないと思います。コメントを一緒に使用する必要があります

L[-i or len(L):]
于 2012-07-05T07:10:38.983 に答える