这是我的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'
而没有尾随逗号?
这是我的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'
而没有尾随逗号?
问题是,您为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)
也许告诉**为什么**会很有价值?在这里描述可变对象(列表)和不可变(字符串)之间的区别? – lejlot
@TessellatingHeckler这不适用于此。问题在于,如果在迭代时对列表**进行变更,因为它会改变迭代的长度和结果。通过改变您正在迭代的值,完全没有问题。这就是你迭代95%的时间。这些链接问题的一些答案完全是做这件事的。 –
当然,使用'list(map(...))'这个函数肯定是不可思议的,但是我更愿意看到'cn = [c [: - 1] if c.endswith(',')else c for c in cn]列表comp比你上面的for循环。 –
你做了什么是复制串编辑,并将其存储在一个名为c
新的变量,用同一个冲突名称原始c
并覆盖它。
由于您没有更改原始文件,因此当新文件超出范围并被清除时,它保持不变。
你可以做这样的事情做出一个新的列表,包含改变后的字符串:
newlist = [c.strip(',') for c in cn]
或者,更贴近您的例子,同时保持这种方法:
cn = [c[:-1] if c.endswith(',') else c for c in cn]
交替循环在另一个答案中使用枚举方法是可行的,但是我避免了这种方法,因为一般来说,在迭代它们的同时更改列表可能会导致错误,除非仔细地进行,这使我认为在遇到还有另一个合理的整洁a接近角。
您正在更改循环变量c
,但您不更改列表cn
。要更改列表cn
,而不是循环通过其值,则循环通过其索引。这是一个实现。
for c in range(len(cn)):
if cn[c].endswith(','):
cn[c] = cn[c][:-1]
在Python中看到这种类型的结构很奇怪。你应该更喜欢'对于idx,enumerate(cn)'的值'。 –
@AdamSmith哇,我从来没有这样想过!另一个Python技术添加到我的大脑中... –
@juanchopanza不能同意你的意见;这里的问题不是如何去掉逗号,而是如何改变列表元素。 –
@LevLevitsky是的,我倾向于同意。 – juanchopanza