2

首先提前感谢,对python还是很陌生。

我有以下列表:

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

我尝试使用 .replace 代码:

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

这取代了“和”,但我打印列表后的输出是:

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

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

4

3 回答 3

8

在这里使用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.splitsep在传递给它的字符串(或默认情况下在任何空格处)拆分字符串并返回一个列表。

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

,在字符串中使用两个单词之间添加 astr.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
于 2013-06-19T16:05:35.767 回答
0

问题是您正在手动更改字符串,使其看起来像两个单独的列表项。这与将字符串拆分为多个对象不同。使用该str.split方法。

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

您也可以在列表理解中一次完成所有这些操作。但是,阅读起来不太直观,因此我个人更喜欢在这种情况下使用显式循环。可读性很重要!

new_grocery_list = [subitem for item in GroceryList for subitem in item.split(' and ')]
print(new_grocery_list)
于 2013-06-19T16:10:53.443 回答
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']
于 2013-06-19T16:17:32.907 回答