Python 如何根据函数从另一个列表创建列表?

Python 如何根据函数从另一个列表创建列表?,python,list,Python,List,我想创建一个列表,其中的值对应于另一个列表。 例如,如果我有: listA = [1, 2, 3, 4, 5,...] 我想创建另一个相同的列表,除了所有的值都根据x^2(或任何其他函数)变化外,给出: 我已经尝试通过执行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 lis

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

listA = [1, 2, 3, 4, 5,...]
我想创建另一个相同的列表,除了所有的值都根据x^2(或任何其他函数)变化外,给出:

我已经尝试通过执行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
listA=[1,2,3,4]
listB=范围(1,4,1)
i=0

虽然i您可以尝试使用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]
listB = [i**2 for i in listA]
listA = [1, 2, 3, 4]

listB = [x**2 for x in listA]

有一种智能语法用于从其他列表中构建列表:

listB = [x*x for x in listA]
编辑:永远不要直接使用
range
作为列表,即使它在Python 2中创建了一个列表,因为它在Python 3中会抛出一个
range
对象。使用
列表(范围(…)

当列表仅由数字组成时,流行的numpy库为执行此类列表操作提供了更简洁的语法。它使用在某些情况下更快的数组,如按元素乘法。上述陈述可以改写为:

arrayB = arrayA * arrayA

或(不总是推荐)


元素乘法有时被称为hadamard乘积,它来自向量算术(还有
a@b
在numpy中)。在numpy中,必须使用
np.array
np.arange
创建数组。最后一个类似于Python 2中的
range
,它直接创建一个数组。

您可以使用
numpy
库和一个名为


有多种方法可以满足您的要求,其他人指出了
list
理解和
map
s

查看您的代码:

listB = range(1, 4, 1)
只有3项,
[1,2,3]
范围()
达到但不包括
停止
参数。您不需要初始化
listB
,因为您只需在循环中
listB.append()
,因此
listB=[]
就足够了。注意:在python3中,这会将
range()
对象分配给
listB
,并且不会按照您的意图初始化列表

i = 0
while i <= 4:
这不起作用,因为您的循环从
0
转到
4
(包括)并且
范围(1,4,1)
只有3项
[1,2,3]

    i = i + 1
不需要for
循环

将所有这些放在一起,并按照您所描述的那样迭代执行:

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]
注:我倾向于列表理解:

new_list = [i**2 for i in listA]
listB = [i**2 for i in listA]
listA = [1, 2, 3, 4]

listB = [x**2 for x in listA]

当需要迭代列表并需要索引时,Python提供了
enumerate
函数。这样可以避免容易避免的索引器,如:

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()

可以使用列表理解:

new_list = [i**2 for i in listA]
listB = [i**2 for i in listA]
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)

因为没有人真正解决问题:
i
从0开始,一直到并包括
4
listA[0]
是1,但是没有
listA[4]
,最多有
listA[3]
,它是4。
范围(1,4,1)
只有3项。因此,
listA
是4项,
listB
是3项,
while
循环是5项。感谢所有的帮助,所有这些似乎都有相同的总体思路,非常感谢。这没有给现有的答案添加任何新内容。@AChampion,你是什么意思?我认为我的答案比别人的答案更简单、更容易理解。