给出以下示例:
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的答案中阅读详细信息。