2013-07-11 196 views
2

一種奇怪的請求。獲取列表的元素通過python中的每個索引?

比方說,我有以下列表:

[1,2,3] 

我想要的東西,比方說,9號,通過各項指標,拿到名單的下面的列表:

[[9,1,2,3], 
[1,9,2,3], 
[1,2,9,3], 
[1,2,3,9]] 

任何想法如何輕鬆做到這一點?另外,這種事情有沒有名字?

編輯:我知道我可以做類似如下:

lists=[] 
for i in range(4): 
    new_list = [1,2,3] 
    new_list.insert(i,9) 
    lists+=[new_list] 

,但我認爲這是不雅。思考?

+0

'for'循環是最好的選擇。它易讀易懂。把它包裝在一個功能中,你很好去。 –

回答

6

你可以做些什麼像

l = [1,2,3] 
new_l = [l[:i] + [9] + l[i:] for i in range(len(l) + 1)] 
+1

不錯 - 我剛剛發佈了相同的答案! –

+1

是的,我在打字的時候,他的彈出太大了+1 – Brian

+1

我打算髮布完全相同的東西。 – 2rs2ts

3

怎麼樣一個循環:

l = [1,2,3] 
res = [] 
for i in xrange(len(l)+1): 
    l2 = l[:] 
    l2.insert(i,9) 
    res.append(l2) 

這裏是另一件事我想到:

l = [1,2,3] 
q = [l[:] for _ in range(len(l)+1)] 
map(lambda(x):x.insert(q.index(x),9), q) 

然後q將包含您的列表:

print q 
[9, 1, 2, 3], [1, 9, 2, 3], [1, 2, 9, 3], [1, 2, 3, 9]] 
+0

哎呀,我在你發佈這篇文章的同一時間編輯了我的文章。我已經有了這個解決方案;我想找一些「可愛」的東西。 (並不是說這種方法有什麼不妥。) – rhombidodecahedron

0

enumeraterepeat是你的朋友。

from itertools import repeat 

some_list = [1, 2, 3] 
new_lists = [] 
new_elt = 9 
for i, lst in enumerate(L[:] for L in repeat(some_list, len(some_list)+1)) 
    lst.insert(i, new_elt) 
    new_lists.append(lst) 

print new_lists 
+1

該列表可以寫成'[[1,2,3]] * 4',然後替換爲'4'以允許可變長度。枚舉調用丟失。 – Brian

+0

@Brian不,它不能。該語法創建列表[4]的4個淺拷貝[1,2,3],這意味着不是獲得'移動九'效果,所有結果列表看起來像[9,9,9,9,1,2,3] 。在REPL中嘗試一下。 – user2479509

相關問題