2012-06-28 15 views
2

我需要做一個排列,看起來像1-N序列,0填充到位#k。在Python中進行移位排列

這種方法的工作,但有什麼更簡單的使用內置函數?

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

只要創建一個新列表,並在需要的地方插入0即可。

def permshift(n, k): 
    lst = range(1, n) 
    lst.insert(k, 0) 
    return lst 
+2

3相同的答案,在10秒內。 :)刪除我的 – JBernardo

+1

@JBernardo四,如果你算上我準備粘貼的那個,當它告訴我有三個新答案時。 :^) – DSM

+0

@JBernardo:是的,我知道那是什麼感覺。 :] – voithos

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:] 
1

呵呵 - 這很有趣,當這麼多人們拿出相同的解決方案

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

我實際上比基於列表的方法更喜歡這個。 – voithos

1

好的答案已,但這裏是一個行版本踢和笑聲:

permshift = lambda n,k: range(1, k+1) + [0] + range(k+1, n) 
0
from itertools import chain 

def permshift(n,k): 
    return chain(xrange(1,k+1), [0], xrange(k+1,n))