2

#kに0が詰め込まれた1-Nのシーケンスのように見える順列を作成する必要があります。

この方法は機能しますが、組み込み関数を使用してもっと簡単なものはありますか?

def permshift(n,k):
   return [0 if x == k else x+(x<k) for x in range(n)]

>>> permshift(7,0)
[0, 1, 2, 3, 4, 5, 6]
>>> permshift(7,1)
[1, 0, 2, 3, 4, 5, 6]
>>> permshift(7,2)
[1, 2, 0, 3, 4, 5, 6]
>>> permshift(7,3)
[1, 2, 3, 0, 4, 5, 6]
>>> permshift(7,4)
[1, 2, 3, 4, 0, 5, 6]
>>> permshift(7,5)
[1, 2, 3, 4, 5, 0, 6]
>>> permshift(7,6)
[1, 2, 3, 4, 5, 6, 0]
4

5 に答える 5

4

新しいリストを作成し、0必要な場所に挿入するだけです。

def permshift(n, k):
    lst = range(1, n)
    lst.insert(k, 0)
    return lst
于 2012-06-28T20:50:29.463 に答える
2

より多くの行が、私はそれがより簡単だと思います:

def permshift(n, k):
   x = range(1, n)
   x.insert(k, 0)
   return x

これは、最も一般的に繰り返される回答よりも短い興味深いものです。

def permshift(n, k):
   x = range(1, n)
   return x[:k] + [0] + x[k:]
于 2012-06-28T20:50:54.293 に答える
1

Hehe-非常に多くの人が同じ解決策を思いついたときは面白いです

def permshift(n,k):
     r = range(1,n)
     r.insert(k,0)
     return r

完全を期すために、効率を本当に気にするなら、ここにジェネレータ式があります

def permshift(n,k):
    for i in xrange(1,n):
        yield i
        if i == k:
            yield 0

print list(permshift(7,2))
于 2012-06-28T20:52:07.643 に答える
1

すでに良い答えですが、キックとギグルの1行バージョンは次のとおりです。

permshift = lambda n,k: range(1, k+1) + [0] + range(k+1, n)
于 2012-06-28T20:58:38.060 に答える
0
from itertools import chain

def permshift(n,k):
    return chain(xrange(1,k+1), [0], xrange(k+1,n))
于 2012-06-28T21:20:53.457 に答える