Python:将列表中的一个项目转换为两个项目

时间:2013-06-19 16:04:00

标签: python

首先感谢提前,对python来说还是一个新手。

我有以下列表:

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

我尝试使用.replace代码:

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

这会替换'和',但打印列表后的输出是:

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

这留下两个引号,在四个项目而不是预期的五个项目上创建另一个列表。 有谁知道为什么? (在你的解释中,如果可能的话,你能解释一下我做错了吗?)

3 个答案:

答案 0 :(得分:6)

在此使用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

答案 1 :(得分: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)

答案 2 :(得分: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']