2015-12-01 206 views
0

这是我的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'而没有尾随逗号?

+1

@juanchopanza不能同意你的意见;这里的问题不是如何去掉逗号,而是如何改变列表元素。 –

+0

@LevLevitsky是的,我倾向于同意。 – juanchopanza

回答

5

问题是,您为c指定了一个新值,但不更新列表。 为了操作列表中的地方,你需要做这样的事情:

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

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

枚举让你列表中的所有元素,用他们的指数一起,然后,如果字符串末尾有逗号你只需更新列表元素和正确的索引。

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

你也可以使用列表理解才达到这可能是这样一个小任务更Python相同的结果:(由@AdamSmith提到的)

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

这确实从cn每个创建一个新的列表如果元素不以,结束,则返回元素,否则在返回字符串之前切断逗号。

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

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

也许告诉**为什么**会很有价值?在这里描述可变对象(列表)和不可变(字符串)之间的区别? – lejlot

+0

@TessellatingHeckler这不适用于此。问题在于,如果在迭代时对列表**进行变更,因为它会改变迭代的长度和结果。通过改变您正在迭代的值,完全没有问题。这就是你迭代95%的时间。这些链接问题的一些答案完全是做这件事的。 –

+0

当然,使用'list(map(...))'这个函数肯定是不可思议的,但是我更愿意看到'cn = [c [: - 1] if c.endswith(',')else c for c in cn]列表comp比你上面的for循环。 –

1

你做了什么是复制串编辑,并将其存储在一个名为c新的变量,用同一个冲突名称原始c并覆盖它。

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

你可以做这样的事情做出一个新的列表,包含改变后的字符串:

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

或者,更贴近您的例子,同时保持这种方法:

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

交替循环在另一个答案中使用枚举方法是可行的,但是我避免了这种方法,因为一般来说,在迭代它们的同时更改列表可能会导致错误,除非仔细地进行,这使我认为在遇到还有另一个合理的整洁a接近角。

+1

复制列表(数据)与变换一个元素不一样 – kwarunek

+2

这将删除* all *逗号。该OP仅带1. –

+0

@ZachGates在字符串的开头还有逗号。 – jpmc26

0

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

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

在Python中看到这种类型的结构很奇怪。你应该更喜欢'对于idx,enumerate(cn)'的值'。 –

+0

@AdamSmith哇,我从来没有这样想过!另一个Python技术添加到我的大脑中... –