在遍历列表时编辑列表(pythonic方式!)

2024-09-30 05:18:34 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我知道如何做到这一点,但它似乎不太Pythonmee。有没有更干净的方法?你知道吗

arr = list(range(10))
print(arr)
for n in range(len(arr)):
    # Perform som operation on the element that changes the value "in place"
    arr[n] += 1
print(arr)

输出(这是我想要的):

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Tags: the方法inforlenonrangeelement
3条回答

他们说了什么。但如果要在创建列表时执行此操作,可以执行以下操作:

arr = [u + 1 for u in range(10)]

我猜你用的是python3。如果您使用的是Python 2,那么将range更改为xrange(除非列表大小非常小),因为Python 2 range函数返回一个实际的list,但是xrange返回一个迭代器;Python 3 range函数返回一个与旧的xrange类似的迭代器(但是有一些改进)。你知道吗

如果arr是要修改的现有list,而不使用新的list对象替换当前的list对象,则可以

arr[:] = [u + 1 for u in arr]

下面的一些代码说明了在赋值的左侧使用arrarr[:]之间的区别。你知道吗

arr = list(range(10))
b = arr
print(id(arr), id(b))
arr = [u + 1 for u in arr]
print(id(arr), id(b))
print(arr, b)

c = arr
print(id(arr), id(c))
arr[:] = [u + 1 for u in arr]
print(id(arr), id(c))
print(arr, c)

输出

3073636268 3073636268
3073629964 3073636268
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3073629964 3073629964
3073629964 3073629964
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11] [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

因此arr = [u + 1 for u in arr]将名称arr绑定到一个新的列表对象,但是arr[:] = [u + 1 for u in arr]有效地改变了现有的列表对象。”它在hood下创建一个新的临时列表对象,然后将其内容复制到旧的列表对象。你知道吗

您可以使用list comprehension

arr = [i + 1 for i in arr]

这将生成一个新的列表;在上面的示例中,我将结果反弹到相同的名称。你知道吗

如果对列表有多个引用,并且需要就地更改它(以便其他引用可以看到更改),请指定给标识片([:])以更新列表的所有索引,而不是重新绑定名称:

arr[:] = [i + 1 for i in arr]

这将首先创建一个新的list对象,然后Python将非常聪明地看到两个列表的大小相同,并且在再次释放第二个列表之前只在元素之间进行复制。你知道吗

在这种情况下,您甚至可以使用生成器表达式来避免创建额外的列表:

arr[:] = (i + 1 for i in arr)

这会将原始元素移到一边,以便为新元素腾出空间,但不会为此创建新的Python列表对象。这应该是一个内存效率更高。你知道吗

使用列表理解:

arr = [x + 1 for x in arr]

相关问题 更多 >

    热门问题