2016-05-31 5 views
3

私はそのように見えるのリストがあります:Python - リストを減らして値を保持する方法は?

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

最初の値が、私は箱ひげ図が作成されたソリューションが必要になりますboxplottingでは約3000の値

の全体的な数で、3から15までの範囲をすべての第2の値を有する各第1の値について、同様に:

ように見える
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

2番目の値の順序は重要ですか? –

+0

いいえ、それはボックスプロットのデータポイントとして使用されるため、表示されません – dh81

+0

[12、****]にはnまたは数百の値があります。それぞれに2つだけではありません。 – dh81

答えて

2

最初の値がキーで、2番目の値がリストの要素であるように思えます。 (あなたの例のデータを使用して){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が得られます

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

この:あなたのような何かを行うことができます。あなたのデータ(リストのリスト)が最初の値でソートされているとします。

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

はそうあなたがすでにキーかどうかを確認する必要はありませんlistとしてデフォルトでdefaultdictを使用します存在する。そして、キーとして最初のアイテムを使用して値収集:このように

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

しかし、ここでは12から始まるn値ができます... – dh81

0

(他の回答はあなただけで認識していなかったような何か

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]] 

のデータポイントが必要です。さらに、奇数のデータポイントを持つリストではどうすべきでしょうか?

関連する問題