我想创建一个列表,其中的值对应于另一个列表。例如,如果我有:
listA = [1, 2, 3, 4, 5,...]
Run Code Online (Sandbox Code Playgroud)
我想创建另一个相同的列表,除了所有值都根据 x^2(或任何其他函数)而变化,给出:
listB = [1, 4, 9, 16,25, ...]
Run Code Online (Sandbox Code Playgroud)
我已经尝试通过执行 while 循环来做到这一点:
listA = [1, 2, 3, 4]
listB = range(1, 4, 1)
i = 0
while i <= 4:
listB [i] = (listA [i]) ** 2
i = i + 1
print listA
print listB
Run Code Online (Sandbox Code Playgroud)
但它只是吐出一条错误消息:
Traceback (most recent call last):
File "/home/tim/Desktop/Python/test.py", line 5, in <module>
listB [i] = (listA [i]) ** 2
IndexError: list assignment index out of range
Run Code Online (Sandbox Code Playgroud)
有什么建议吗?谢谢
您可以尝试这样做,使用 lambda 函数将您想要的任何更改应用于列表中的每个元素。在这种情况下,该函数对列表中的每个值进行平方:
listA = [1, 2, 3, 4, 5,...]
operation = lambda x:x**2
new_list = map(operation, listA)
Run Code Online (Sandbox Code Playgroud)
此外,您可以在列表理解中执行函数操作:
new_list = [i**2 for i in listA]
Run Code Online (Sandbox Code Playgroud)
有一种智能语法可以从其他列表中构建列表:
listB = [x*x for x in listA]
Run Code Online (Sandbox Code Playgroud)
编辑:永远不要range直接用作列表,即使它在 Python 2 中生成列表,因为它range在 Python 3 中吐出一个对象。请使用list(range(...))!
当列表仅由数字组成时,流行的numpy库提供了更简洁的语法来执行此类列表操作。它使用在某些情况下更快的数组,例如元素乘法。上面的语句可以重写为:
arrayB = arrayA * arrayA
Run Code Online (Sandbox Code Playgroud)
或者
arrayB = arrayA ** 2
Run Code Online (Sandbox Code Playgroud)
或(并不总是推荐)
f = lambda a: a**2
arrayB = f(arrayA)
Run Code Online (Sandbox Code Playgroud)
元素乘法有时被称为 hadamard 乘积,它来自向量算术(a@bnumpy 中也有)。np.array在 numpy 中,您必须使用或创建数组np.arange。range最后一个与 Python 2 中的方式类似,它直接创建一个数组。