2012-06-05 28 views
10

我做了相當多的細讀,但對於我想要了解的概念,我沒有明確的答案。使用列表中的字符串進行切片分配

在Python,如果我帶的列表,比如:

L1=['muffins', 'brownies','cookies'] 

然後嘗試通過使用代碼到第一指針替換爲一個對象中的列表中,即「鬆餅」:

L1[0:1] = 'cake' 

我會得到一個列表L1:

['c', 'a', 'k', 'e', 'brownies', 'cookies'] 

然而,如果我採取了同樣的名單和執行的操作(現在從字符串蛋糕上的4個元素):

L1[0:4] = ['cake'] # presumably, it's now passing the string cake within a list? (it passed into the modified list shown above) 

我得到我最初期望的輸出:

['cake', 'brownies', 'cookies'] 

誰能解釋這是爲什麼,到底是什麼? 我假設,當我最初沒有將它放入「列表」中時,它會將字符串分解爲單個字符,以便將其存儲爲對這些字符的引用,而不是對單個字符串的引用...

但我不完全確定。

+5

我認爲它滑稽你拿了一塊蛋糕:) – corn3lius

+0

你的最後一個例子'L1 [0:4] = [ '蛋糕']''收益率[ '蛋糕']'對我來說,不python 2.6上的['cake','brownies','cookies']'' - 還要注意,因爲你已經有5個upvotes,顯然你問了一個很好的問題:) – mgilson

+0

啊,最後一個例子是關於已經被修改的代碼 - 而不是使用:'L1 = [ '蛋糕','布朗尼','餅乾'],我正在執行最後一個例子'L1 = ['c','a','k','e','布朗尼','餅乾']' 。 – Noc

回答

14

兩個要點:

  1. 切片分配需要上的右手側可迭代,並取代與由可迭代產生的對象的切片的元件。
  2. 在Python中,字符串是可迭代的:迭代字符串會產生其字符。

因此

L1[0:1] = 'cake' 

取代的L1第一元件與各個字符的'cake'

要更換以字符串'cake'第一元件,簡單地寫爲:

L1[0] = 'cake' 

,或者使用切片賦值語法:

L1[0:1] = ['cake'] 
+0

非常感謝,我很欣賞這種迴應;這清除了很多混亂。 – Noc

7

如果你指定一個切片,右側被認爲是一個列表/元組(實際上,任何可迭代 - 但要注意產生不確定數量值的生成器)。

要在列表中替換的項目,使用方法:

my_list[0] = "cake" 

(你也可以做

my_list[0:1] = ["cake"] 

,如果你真的想用一個列表切片

這裏有夫婦其他相關參考: slice assignment more slice assignment

+1

+1您的答案的第一行 – Levon

+1

@Levon - 感謝您說出一些不錯的東西!我真的很喜歡你的個人資料順便說一句 - 我可以複製/重述它爲我的?我對我在答案中看到的耶和華的態度感到非常厭惡。我試着用足夠的信息來回答這個問題,針對我認爲他們的水平(和興趣)。 –

+1

當然,繼續吧,很高興我不是唯一注意到一些會員態度的人。我完全同意,我也試圖根據OP的水平來量身定製反應。如果問題非常基本,那麼沒有人會展示Python的實力。更好地幫助一個堅實的基本答案,並保存花式的東西,爲更高級的問題:) ..說了這麼多,這是一個很好的問題,也得到了我的讚揚。 – Levon

3

字符串看作是存儲字符的序列容器。當您嘗試以這種方式進行分配時,它會將字符序列中的每個項目添加到列表中。通過首先將「cake」包裝在它自己的1元素列表中(我們將其稱爲L2),而不是將L2的每個元素都添加到L1中 - 它不會遞歸地將序列容器分割到最外層序列之外。

L1 = ['muffins', 'brownies','cookies'] 
L2 = ['cake'] 
L1[0:1] = L2 
print L1 
['cake', 'brownies', 'cookies'] 

對於其他嵌套序列對象也是如此。嘗試用多個嵌套序列的實驗對象是這樣的:

L3 = [['pie', 'eclairs'], ['bacon', 'chocolate']] 
L1[0:1] = L3 
print L1 
[['pie', 'eclairs'], ['bacon', 'chocolate'], 'brownies', 'cookies'] 

另外值得一提的是,如果你沒有在列表關心訂單/定位,您可以使用append(),而不必擔心你的字符串越來越分裂達:

L1 = ['muffins', 'brownies','cookies'] 
L1.append('cake') 
print L1 
['muffins', 'brownies', 'cookies', 'cake']