2012-08-14 72 views
0

例如創建,其中每個元素的基礎上創建一個嵌套列表的指數在python

alist = [[1,2],[10,10],[5,5]] 

名單我想創建一個具有每個列表[第n]元素的平均一個新的列表和列表[n + 1]元素。其中n是列表的大小。我希望它有你所期待的範圍步驟([開始],停止[工序])的行爲,如果步驟是2

所以從所需的輸出工作向後

output = [[5.5,6],[5,5]] 

output = [[(1 + 10)/2 , (2 + 10)/2], [5,5]] # The last list has no matching list, so it remains unchanged 

output = [[(alist[0][0] + alist[1][0])/2, (alist[0][1] + alist[1][1])/2), alist[2],alist[2] 

output = alist[nth ][yth] + alist[n + 1][y + 1] .... 

我走下了幾條試圖做這項工作的道路,從來沒有遇到過解決方案。我覺得在迭代器模塊中應該有所幫助。

有什麼建議嗎?

+2

我很難搞清楚你到底想做什麼。你可以試着再次解釋你是如何得到輸出的。 [5.5,6]看起來像1和10以及2和10的平均值,但輸出中的[5,5]來自哪裏? – Julian 2012-08-14 03:57:59

+0

我希望找到一個解決方案,在奇數列表的情況下只留下最後一個元素,因爲它沒有任何配對。 – 2012-08-14 04:57:46

+0

你可以檢查一個奇數列表並追加最後一個值到最後使其成爲偶數 – 2012-08-14 06:44:29

回答

3
>>> [[(x+y)*.5 for x,y in zip(*item)] for item in zip(alist, alist[1:])] 
[[5.5, 6.0], [7.5, 7.5]] 

你可以做itertools

了更大的內存效率的版本
>>> from itertools import izip, islice 
>>> [[(x+y)*.5 for x,y in izip(*item)] for item in izip(alist, islice(alist,1,None))] 
[[5.5, 6.0], [7.5, 7.5]] 

編輯:仍然沒有一定的OP要爲普通情況下的東西,但這裏有幾個選擇

>>> alist = [[1,2],[10,10],[5,5]] 
>>> if len(alist)%2: 
...  alist.append(alist[-1]) 
... 
>>> [[(x+y)*.5 for x,y in zip(*item)] for item in zip(alist, alist[1:])] 
[[5.5, 6.0], [7.5, 7.5], [5.0, 5.0]] 
>>> [[(x+y)*.5 for x,y in zip(*item)] for item in zip(alist[::2], alist[1::2])] 
[[5.5, 6.0], [5.0, 5.0]] 
+1

我認爲OP希望輸出的第二項是'[5,5]'。也就是說,從[a,b,c]他不想要平均(a,b)和平均(b,c),他需要平均值(a,b),平均值(c)。或者至少可以解釋他的例子中的[5,5]。 – DSM 2012-08-14 04:00:56

+1

@DSM,那不是第n和第n + 1的通常含義,應該說是(2 * n)th和(2 * n)th + 1。將等待OP澄清 – 2012-08-14 04:07:34

0

爲什麼不是一個易於閱讀的版本?

alist = [[1,2],[10,10],[5,5]] 
output = [] 

for i in range(0, len(alist) - 2): 
    avg1 = (alist[i][0] + alist[i + 1][0])/2.0 
    avg2 = (alist[i][1] + alist[i + 1][1])/2.0 
    output.append([avg1, avg2]) # append averages 
output.append([1.0 * j for j in alist[-1]) 
# append final list as a list of floats ([5.0, 5.0] in this case) 

>>> output 
[[5.5, 6.0], [5.0, 5.0]] 
相關問題