2013-06-19 218 views
2

首先在此先感謝,對Python仍然很新穎。Python:將列表中的一個項目變成兩個項目

我有以下列表:

GroceryList = ['apples', 'oranges', 'strawberries and grapes', 'blueberries'] 

我一直在使用.replace的代碼嘗試:

GroceryList = [f.replace('and', '\'' + ',' + '\'') for f in GroceryList] 

這取代了「和」,但輸出後,我打印的清單是:

['apples', 'oranges', "strawberries ',' grapes", 'blueberries'] 

這留下兩個引號在四個項目而不是預期的五個創建另一個列表。 有誰知道爲什麼? (在你的解釋,如果可能的話,是否也能解釋我做錯了嗎?)

+0

您正在更換字符串。你不是通過用''''或''「''分隔它們來創建新的字符串。所有這些操作都在字符串的範圍內。 – eLRuLL

回答

5

使用str.splitstr.join這裏:

>>> GroceryList = ['apples', 'oranges', 'strawberries and grapes', 'blueberries'] 
>>> [", ".join(x.split(' and ')) for x in GroceryList] 
['apples', 'oranges', 'strawberries, grapes', 'blueberries'] 

或可能是你想要的:

>>> [y for x in GroceryList for y in x.split(' and ')] 
['apples', 'oranges', 'strawberries', 'grapes', 'blueberries'] 

str.split分割傳遞給它的sep的一個字符串(或者在任何空白處默認)並返回一個列表。

>>> strs = 'strawberries and grapes' 
>>> strs.split(' and ') 
['strawberries', 'grapes'] 

添加一個字符串中使用str.replace一句話,兩者之間並沒有使得這兩個不同的字符串,您只需修改該字符串,並在其中添加了一個逗號。

類似的方法是使用ast._literal_eval,但在此處推薦。

但這需要單詞引號。

例子:

>>> from ast import literal_eval 
>>> strs = '"strawberries" and "grapes"' 
>>> literal_eval(strs.replace('and', ',')) # replace 'and' with a ',' 
('strawberries', 'grapes')     #returns a tuple 
+0

完美,謝謝你的幫助。 – user1496368

+0

感謝您描述這兩種解決方案。考慮到問題標題(「將列表中的一個項目變成兩個項目」),您可以首先提出第二個拆分解決方案,因爲它回答了問題 - 然後提供您的拆分連接作爲後續...。 – JeremyDouglass

0

的問題是,您要手動改變串看起來像兩個單獨的列表項。這與將字符串拆分爲多個對象不同。爲此,請使用str.split方法。

new_grocery_list = [] 
for item in GroceryList: 
    new_grocery_list.extend(item.split(' and ')) 
print(new_grocery_list) 

你也可以在列表理解中一次做所有的事情。但是,閱讀起來不那麼直觀,所以我個人更喜歡這種情況下的顯式循環。 Readability counts!

new_grocery_list = [subitem for item in GroceryList for subitem in item.split(' and ')] 
print(new_grocery_list) 
+0

'str .split'不會將一個字符串轉換爲兩個字符串。 – eLRuLL

+0

'str.split'從字符串中創建一個列表。 – eLRuLL

0

可以使用以下只分上and爲一個字,之後一起加入回來......

from itertools import chain 
import re 

GroceryList = ['apples', 'oranges', 'strawberries and grapes', 'blueberries'] 
new_stuff = list(chain.from_iterable(re.split(r'\b\s*and\s*\b', el) for el in GroceryList)) 
# ['apples', 'oranges', 'strawberries', 'grapes', 'blueberries'] 
相關問題