Python列出了切片和+=运算符



给出以下示例:

array = [1,2,3,4,0]

In: array[0] += 2 
Out: 3
In: array[1:3] += 2  
Out: TypeError: 'int' object is not iterable
In: array[1:3] += [100, 100] 
Out: [1, 2, 3, 100, 100, 4, 5]

有人能解释一下为什么最后两个例子不会返回类似[11021103,0]的东西吗?如果可以用一个简单的切片来完成,而不使用for循环

使用slice运算符时,它指的是列表的子部分,因此对其进行操作也需要列表(与其他一些语言不同,我们可以将list上的"add"运算符与list一起使用,而不与int一起使用(。

因此,以下内容:

array[1:3] += 2

投掷:

TypeError: 'int' object is not iterable

因为2不是列表(实际上是可迭代的,它比list更通用(。

但是:

array[1:3] += [100, 100]

根据索引对array中间(索引3(的两个元素进行运算并相加(实际相加(:

[3, 2, 3, 100, 100, 4, 0]

根据请求不使用for循环

如果要添加到切片中的值:

array = [1,2,3,4,0]
array.__setitem__(slice(1, 3), [x+2 for x in array[1:3]])
# [1, 102, 103, 4, 0]
print(array)

也可以写成:

array = [1,2,3,4,0]
def apply_on_slice(lst, start, end, callable):
array.__setitem__(slice(start, end), [callable(x) for x in array[start:end]])
apply_on_slice(array, 1, 3, lambda x : x + 100)
# [1, 102, 103, 4, 0]
print(array)

使用for循环

这里有一些其他选项可以做到这一点,非常优雅:

array[1:3] = (x+2 for x in array[1:3])

或者当然,使用正则for循环,这比使用两次切片更有效:

for i in range(1, 3): 
array[i] += 2

您显然希望像在R和其他语言中(以及在Python中,在numpy数组等中(一样,按元素应用该操作。例如,向列表添加2将向列表的每个元素添加2。Python列表不是这样工作的:您询问的关于构造的每个语句在运算符的每一侧都有一个对象(列表或列表切片、列表元素、整数(,然后将该操作(仅一次(应用于这两个对象。所以如果你;添加";两个列表连接在一起,如果你试图添加一个列表和一个int,你会得到一个TypeError,等等。你可以在@Aviv的答案中阅读详细信息。

最新更新