2016-05-31 48 views
3

我有一個列表尋找這樣的:Python - 如何減少列表並保持值?

[[12, 0.029], [12, 0.039], [12, 0.012], ...some hundreds more... [13, 0.04], [13, 0.01], ...] 

第一個數值範圍爲3〜15,約3000價值

對於boxplotting我需要一個解決方案的總體數量在其中創建箱線圖對於每個具有所有第二值的第一個值。像:

data_to_plot = [ all second values of list with value 12], [all second values of list with value 13],... 

尋找這樣的:

data_to_plot = [0.029, 0.039], [0.04, 0.01],... 

謝謝!

+0

第二個值的排序是否重要? –

+0

不,它不是,因爲它們用作箱形圖的數據點。 – dh81

+0

[12,****]有n個或數百個值。每個不只兩個。 – dh81

回答

2

看起來好像你想要一個字典,第一個值作爲鍵,第二個值作爲列表的元素。你可以這樣做:

data_dict = {} 
for key, value in list: 
    if key not in data_dict: 
     data_dict.update({key: [value]}) 
    else: 
     data_dict[key].append(value) 

這將產生(使用示例數據){12: [0.029, 0.039], 13: [0.04, 0.01]}

+0

但如何在Boxplot工作? – dh81

+1

如AndreyT的回答所示,這與'data_to_plot = data_dict.values()'一起工作' – dh81

0

使用itertools.groupby。假設你的數據(列表清單)按第一個值排序。

import itertools 
import operator 

lists = [[12, 0.029], [12, 0.039], [12, 0.052], [13, 0.04], [13, 0.01], [13, 0.066]] 

data_to_plot = list() 
for name, group in itertools.groupby(lists, key=operator.itemgetter(0)): 
    data_to_plot.append(map(operator.itemgetter(1), group)) 

print(data_to_plot) 
# Output 
[[0.029, 0.039, 0.052], [0.04, 0.01, 0.066]] 

如果子列表未經預先排序,你應該groupby之前對它們進行排序,

data_to_plot = list() 
for name, group in itertools.groupby(sorted(lists), key=operator.itemgetter(0)): 
    data_to_plot.append(map(operator.itemgetter(1), group)) 

print(data_to_plot) 
# Output 
[[0.029, 0.039, 0.052], [0.01, 0.04, 0.066]] 
+0

data_to_plot = list() TypeError:'list'對象不可調用 – dh81

+0

@ dh81,在我的機器上運行良好。你能否給我更多的細節? – SparkAndShine

1

使用defaultdict默認爲list,所以你並不需要檢查,如果已經是關鍵存在。然後收集使用第一項爲鍵的值:

from collections import defaultdict 

result = defaultdict(list) 

lst = [[12, 0.029], [12, 0.039], [13, 0.04], [13, 0.01]] 
for l in lst: 
    result[l[0]].append(l[1]) 

print(list(result.values())) 
# [[0.029, 0.039], [0.04, 0.01]] 

這樣,你還是知道哪些values屬於哪個keys

data_to_plot = result.values() 
keys_for_data = result.keys() 
1

可以使用迭代器(但對的列表中應該有一個甚至長度):

data = [[12, 0.029], [12, 0.039], [13, 0.04], [13, 0.01]] 
iter_second = (x[1] for x in data) 
#py2 
data_to_plot = zip(*([iter_second]*2)) 
#py3 
data_to_plot = tuple(zip(*([iter_second]*2))) 

But here can be n values starting with 12

data = [[12, 0.029], [12, 0.039], [12, 0.012], [13, 0.04], [13, 0.01]] 
d = collections.defaultdict(list) 
for key, val in data: 
    d[key].append(val) 
# if you need same order as in `data` use OrderedDict with setdefault method 
data_to_plot = d.values() 
# Output: [[0.029, 0.039, 0.012], [0.04, 0.01]] 
+0

這是一個很好的:) – Overdrivr

+0

但是,這裏可以是n值從12開始... – dh81

0

喜歡的東西(其他的答案是不知道,你只想要有12個數據點作爲第一個值):

data = [[12, 0.029], [12, 0.039], [13, 0.04], [13, 0.01]] 

items = [] 
points = [point[1] for point in data if point[0] == 12] 
for i in range(0, len(points), 2): 
    try: 
     items.append([points[i], points[i+1]]) 
    except IndexError: 
     pass 

print items 
# [[0.029, 0.039]] 

另外,應該如何處理具有奇數個數據點的列表?