就地更新列表

时间:2014-02-28 11:19:07

标签: python list updates

我有一个字符串列表,其中一些以新行符号结尾。我想通过从以它结尾的字符串中删除\ 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是可变对象,但原始列表没有改变。这种行为的原因是什么?

4 个答案:

答案 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 comprehensionstr.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'