2017-06-04 171 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,你是什麼意思?我認爲我的答案更簡單,容易理解,其他人則一致。 –

相關問題