我有一个字符串列表,其中一些以新行符号结尾。我想通过从以它结尾的字符串中删除\ n来修改此列表。为此,我使用以下代码:
aList = ['qwerttyy\n', '123454\n', 'zxcv']
for s in aList:
if s.endswith('\n'):
s = s[: -1]
print(s)
输出如下:
qwerttyy 123454 >>> aList ['qwerttyy\n', '123454\n', 'zxcv']
所以尽管list是可变对象,但原始列表没有改变。这种行为的原因是什么?
答案 0 :(得分:2)
您可以使用切片分配和列表理解:
>>> foo = aList = ['qwerttyy\n', '123454\n', 'zxcv']
>>> aList[:] = [s[:-1] if s.endswith('\n') else s for s in aList]
>>> foo #All references are affected.
['qwerttyy', '123454', 'zxcv']
>>> aList
['qwerttyy', '123454', 'zxcv']
您的代码无效,因为它等同于:
s = aList[0]
if s.endswith('\n'):
s = s[: -1]
s = aList[1]
if s.endswith('\n'):
s = s[: -1]
...
即您正在更新变量s
,而不是实际的列表项
答案 1 :(得分:1)
因为for循环会复制字符串。
您可以使用:
[s[:-1] if s.endswith('\n') else s for s in aList]
也许这更简单,但它也会删除空格。
[s.strip() for s in aList]
答案 2 :(得分:0)
试试这个
>>> aList = ['qwerttyy\n', '123454\n', 'zxcv']
>>> aList = [x[:-1] if x.endswith('\n') else x for x in aList]
>>> aList
['qwerttyy', '123454', 'zxcv']
答案 3 :(得分:0)
使用list comprehension和str.rstrip
>>> aList = ['qwerttyy\n', '123454\n', 'zxcv']
>>> [s.rstrip('\n') for s in aList]
['qwerttyy', '123454', 'zxcv']
以上将创建新列表。要修改原始列表,请使用切片(list[:] = ...
):
>>> aList
['qwerttyy\n', '123454\n', 'zxcv']
>>> aList[:] = [s.rstrip('\n') for s in aList]
>>> aList
['qwerttyy', '123454', 'zxcv']
注意 str.rstrip
会返回[:-1]
的不同结果,当时tehre是多个尾随换行符:
>>> 'qwerttyy\n\n'.rstrip('\n')
'qwerttyy'
>>> 'qwerttyy\n\n'[:-1]
'qwerttyy\n'