2013-10-24 220 views
1

我來自這個問題Get information out of sub-lists in main list elegantly,其中提出了一個很好的解決方案(實際上有兩個)。將元組轉換爲元素列表

我現在的問題是,給出的答案承擔一定數量列表中的元素(我從來沒有說過元素的數量可能會改變,因此這是我的錯真的),產生最終名單。

這是代碼的MWE

a = [[0,1.1, 0.5, 99,99,0.7], [0,0.3, 1.4,99,99, 0.2], [1,0.6, 0.2,99,99, 1.], [1,1.1, 0.5,99,99, 0.3], [2,0.2, 1.1,99,99, 0.8], [2,1.1, 0.5,99,99, 1.], [3,1.2, 0.3,99,99, 0.6], [3,0.6, 0.4,99,99, 0.9], [4,0.6, 0.2,99,99, 0.5], [4,0.7, 0.2,99,99, 0.5]] 

a_processed = [] 

from collections import defaultdict 
nums = defaultdict(list) 
for arr in a: 
    key = tuple(arr[1:5]) # make the first two floats the key 
    nums[key].append(arr[5]) # append the third float for the given key 

a_processed = [[k[0], k[1], k[2], k[3], round(sum(vals)/len(vals),2)] for k, vals in nums.items()] 

返回:

a_processed = [[0.7, 0.2, 99, 99, 0.5], [0.3, 1.4, 99, 99, 0.2], [0.6, 0.2, 99, 99, 0.75], [0.6, 0.4, 99, 99, 0.9], [1.2, 0.3, 99, 99, 0.6], [0.2, 1.1, 99, 99, 0.8], [1.1, 0.5, 99, 99, 0.67]] 

我要替換的最後一行,其中明確姓名的元素k[0], k[1], k[2], k[3]到更多的東西一般。我試着簡單地使用:

a_processed = [[k, round(sum(vals)/len(vals),2)] for k, vals in nums.items()] 

但商店k每個子列表內的元組:

a_processed = [[(0.7, 0.2, 99, 99), 0.5], [(0.3, 1.4, 99, 99), 0.2], [(0.6, 0.2, 99, 99), 0.75], [(0.6, 0.4, 99, 99), 0.9], [(1.2, 0.3, 99, 99), 0.6], [(0.2, 1.1, 99, 99), 0.8], [(1.1, 0.5, 99, 99), 0.67]] 

所以,我怎麼可以概括該行任意數量的元素,而無需顯式地寫下來每一個?

回答

6

轉換的元組使用list(k)列表,然後擴展你需要它包含任何其他元素列表。

(您可以使用+運營商在python串聯列表。)

a_processed = [list(k) + [round(sum(vals)/len(vals),2)] for k, vals in nums.items()] 
+0

這與預期的一樣,應該有這個想法。謝謝! – Gabriel

2

如果我收到了你的問題的權利,以下是你所追求的。

a_processed = [list(k)[:4] + [round(sum(vals)/len(vals),2)] for k, vals in nums.items()] 

+運算符按給定順序連接2個列表。