如何根据功能从另一个列表创建列表?

时间:2017-06-04 15:50:44

标签: python list

我想创建一个列表,其中包含与另一个列表对应的值。 例如,如果我有:

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

有什么建议吗? 感谢

6 个答案:

答案 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)