删除列表项单词后面的逗号

时间:2015-12-01 23:27:45

标签: string list python-2.7

这是我的Python代码(我使用的是Python 2.7.6):

cn = ['here,', 'there']
>>> for c in cn:
    if c.endswith(','):
        c = c[:-1]

>>> print(cn)
['here,', 'there']

正如您所看到的,cn[0]仍然有逗号逗号,即使我c = c[:-1]。如何更改cn[0],使其等于'here'而不使用逗号?

3 个答案:

答案 0 :(得分:5)

问题是您为c分配了一个新值,但没有更新列表。 为了操作列表,您需要执行以下操作:

cn = ['here,', 'there']
for index, c in enumerate(cn):
    if c.endswith(','):
        cn[index] = c[:-1]

print(cn)
['here', 'there']

Enumerate为您提供列表中的所有元素及其索引,然后,如果字符串有一个尾随逗号,您只需更新列表元素和正确的索引。

您的代码存在的问题是c只是持有字符串'here,'。然后,您使用逗号创建了一个新字符串并将其分配给c,这不会影响列表cn。为了对列表产生任何影响,您需要在所需位置设置新值。

您还可以使用列表推导来获得相同的结果,这对于如此小的任务可能更为pythonic :(如@AdamSmith所述)

cn = [c[:-1] if c.endswith(',') else c for c in cn]

这会从cn创建一个新列表,如果它不以,结尾,则返回每个元素,否则在返回字符串之前会删除逗号。

您可以使用的另一件事是内置的rstrip函数,但它会删除所有试用逗号,而不只是一个。它看起来像这样(再次@AdamSmith指出这一点):

cn = map(lambda x: x.rstrip(','), cn)

答案 1 :(得分:1)

您所做的是通过编辑复制字符串,并将其存储在名为c的新变量中,其名称与原始c发生冲突并覆盖它。

由于您没有更改原始内容,因此当新内容超出范围并被清除时,它将保持不变。

您可以执行类似的操作来创建包含已更改字符串的新列表:

newlist = [c.strip(',') for c in cn]

或者,在保持这种方法的同时,更接近你的例子:

cn = [c[:-1] if c.endswith(',') else c for c in cn]

另一个答案中的替代循环枚举方法可行,但我避免使用它,因为一般来说,在迭代它们时更改列表可能会导致错误,除非仔细完成,这让我认为&# 39;在有另一种合理利落的方法的情况下,这是一个坏习惯。

答案 2 :(得分:0)

您正在更改循环变量c,但您不能更改列表cn。要更改列表cn,而不是循环遍历其,请循环遍历其索引。这是一个实现。

for c in range(len(cn)):
    if cn[c].endswith(','):
        cn[c] = cn[c][:-1]