2016-05-31 2 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 мне нужно решение, в котором создается boxplot для каждого первого значения со всеми вторыми значениями. Как:

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

Нет, это не так, поскольку они используются как точки данных для boxplot. – 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

но как работать, чем в коробке? – 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]] 

Кроме того, что делать с списками с нечетным количеством точек данных?

Смежные вопросы