我想创建一个列表,其中包含与另一个列表对应的值。 例如,如果我有:
listA = [1, 2, 3, 4, 5,...]
我想创建另一个相同的列表,除了根据x ^ 2(或任何其他函数)改变所有值,给出:
listB = [1, 4, 9, 16,25, ...]
我已经尝试过做一个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
但它只是吐出一条错误信息:
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
有什么建议吗? 感谢
答案 0 :(得分:1)
您可以尝试使用lambda函数对列表中的每个元素应用您想要的任何更改。在这种情况下,函数正在对列表中的每个值进行平方:
listA = [1, 2, 3, 4, 5,...]
operation = lambda x:x**2
new_list = map(operation, listA)
此外,您可以在列表理解中执行功能操作:
new_list = [i**2 for i in listA]
答案 1 :(得分:0)
列表构建的智能语法优于其他语法:
listB = [x*x for x in listA]
编辑:如果它在python 2中创建一个列表,就不要直接使用range作为列表,因为它在python 3中吐出一个范围对象。使用list(range(...))代替!
答案 2 :(得分:0)
您可以将numpy
库与名为power
import numpy as np
listA = [1,2,3,4]
new_li = np.power(listA, 2)
print new_li
>>> [ 1 4 9 16]
答案 3 :(得分:0)
有多种方法可以满足您的要求,其他人则指出了list
理解和map
。
审核您的代码:
listB = range(1, 4, 1)
只有3个项目,[1, 2, 3]
,range()
最多但不包括stop
arg。您无需初始化listB
,因为您可以在循环中listB.append()
,因此listB = []
就足够了。请注意,在python3中,这会将range()
对象分配给listB
,并且不会按预期对列表进行初始化。
i = 0
while i <= 4:
这会循环5次i = 0, 1, 2, 3, 4
,因为这超过listB
(和listA)
会导致您看到的IndexError
。正常的做法固定循环将使用for
循环,例如for i in range(4):
。但是,您可以使用listA
直接在for i in listA:
中的元素上循环,这将被认为更加pythonic
listB [i] = (listA [i]) ** 2
这不起作用,因为您的循环从0
转到4
(包括),而range(1, 4, 1)
只有3个[1, 2, 3]
项。
i = i + 1
不需要for loop
。
将所有内容放在一起并按照您所描述的方式迭代执行:
listA = [1, 2, 3, 4]
listB = []
for i in listA:
listB.append(i**2)
print(listA) # [1, 2, 3, 4]
print(listB) # [1, 4, 9, 16]
注意:我的偏好是列表理解:
listB = [i**2 for i in listA]
答案 4 :(得分:0)
当您需要迭代列表并需要索引时,Python提供enumerate
函数。这样你就可以避免像这样容易避免的IndexError
:
listA = [1, 2, 3, 4]
listB = [None]*4
for idx, item in enumerate(listA):
listB[idx] = item ** 2
但在大多数情况下,您甚至不需要事先创建listB
,您可以让Python使用map
或“列表理解”为您创建它。其他答案已经涵盖了,但我想分享一些使用map
而不使用lambda
的方法:
import itertools
listB = list(map(pow, listA, itertools.repeat(2, len(listA))))
如果您使用的是python 2.x,则可以省略外部list()
。
答案 5 :(得分:-1)
您可以使用列表理解:
listA = [1, 2, 3, 4]
listB = [x**2 for x in listA]
或正常循环:
listA = [1, 2, 3, 4]
listB = []
for x in listA:
listB.append(x**2)