2011-09-11 166 views
18

我正在尋找最pythonic的方式來實現列表extend函數的一個版本,其中它擴展到一個給定的索引,而不是名單。list extend()以索引,不僅插入列表元素到末尾

a_list = [ "I", "rad", "list" ]              
b_list = [ "am", "a" ] 
a_list.my_extend(b_list, 1) # insert the items from b_list into a_list at index 1 

print(a_list) # would output: ['I', 'am', 'a', 'rad', 'list'] 

有沒有辦法做到這一點,而不建立一個新的列表,像這樣?

a_list = [ "I", "rad", "list" ] 
b_list = [ "am", "a" ] 
c_list = [] 

c_list.extend(a_list[:1]) 
c_list.extend(b_list ) 
c_list.extend(a_list[1:]) 

print(c_list) # outputs: ['I', 'am', 'a', 'rad', 'list'] 

這種方法實際上並不那麼糟糕,但我有一個預感它可能會更容易。可以嗎?

+2

構建一個新列表沒有錯,但爲什麼你要一步一步做呢?它比這更簡單:'c_list = a_list [:1] + b_list + a_list [1:]'。 –

+0

我不知道+是過載的列表。 – mwcz

+0

我需要相同的東西,但幾乎會問,而不是,要求'插入'行爲添加「解壓縮」列表元素在索引中的方式類似的方式'extend'確實...答案將會是相同的:-D – danicotra

回答

41

當然,你可以用切片索引:

a_list[1:1] = b_list 

只是爲了演示的一般算法,如果你要實現在一個假設的自定義listmy_extend功能,它應該是這樣的:

def my_extend(self, other_list, index): 
    self[index:index] = other_list 

但是實際上並沒有這樣做,只需要時使用切片符號。

+0

哈,我知道!我從來沒有想過試試這個;我只是假設它會將整個'b_list'放在索引1的'a_list'中,而不是'b_list'的元素。我顯然需要審查切片的錯綜複雜。非常感謝。 – mwcz

+2

雖然我喜歡這個解決方案,但是它與Python原理略有不同,因爲我不知道會發生什麼(不是你的錯)。我希望有擴展的可選參數... – Stan

+2

我不知道,我認爲這足夠明顯,一旦你習慣了切記法。希望'the_list [i:j] = other_list'對於'i j'的情況(比如'the_list [5:3] = other_list'),那麼我肯定會認爲不應該直覺地明白會發生什麼,但我不認爲語法實際上無論如何工作。 –