2017-06-04 169 views
-3

我想创建一个具有与另一个列表相对应的值的列表。 例如,如果我有:如何根据功能从另一个列表创建列表?

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 

有什么建议吗? 谢谢

+1

因为没有人真正解决什么错:'i'从0开始,去一路攀升并包括'4'。 'listA [0]'是1,但最多不会有'listA [4]',这是'listA [3]',它是4. – Caramiriel

+0

而'range(1,4,1)'只有3个项目。所以'listA'是4项,'listB'是3项,'while'循环是5项。 – AChampion

+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] 
0

没有为listbuilding了别人的智能语法:

listB = [x*x for x in listA] 

编辑:切勿使用范围直接列表,如果它使在Python 2列表,因为它吐出了一个范围对象在Python 3.使用名单(范围(...)),而不是!

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]  
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:,这将是considerd更Python

listB [i] = (listA [i]) ** 2 

这不起作用,因为你的循环去从04(含)range(1, 4, 1)只有3项[1, 2, 3]

i = i + 1 

不必要的一个为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] 
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()

-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) 
+0

这并没有添加任何新的东西,现有的答案。 – AChampion

+0

@AChampion,你是什么意思?我认为我的答案更简单,容易理解,其他人则一致。 –

相关问题