2013-06-19 162 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'] 
相关问题