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,你是什么意思?我认为我的答案比别人的答案更简单、更容易理解。