0

私はPythonでこのようなリストを持っています:

list1 = [('a', 6.5),('a', 6.5),('a', -6.5),('b', 0.0),('b', 0.0),('b',6.5),('b', -6.5)('b',6.5)]

以下を含むリストが必要です。

[(a,avg(6.5,6.5,-6.5),no.of_occurences_of_a),(b,avg(0.0,6.5,-6.5,6.5),no.of_occurences_of_b)]

すなわち

[(a,6.5/3,3)(b,6.5/4,4)]

これを行う方法?

4

3 に答える 3

4

使用できますitertools.groupby

In [19]: list1 = [('a', 6.5),('a', 6.5),('a', -6.5),('b', 0.0),('b', 0.0),('b',6.5),('b', -6.5),('b',6.5)]

In [20]: from itertools import groupby

In [21]: from operator import itemgetter

In [22]: lis=[]

In [23]: for k,v in groupby(list1,key=itemgetter(0)):
    items=[x[1] for x in v]
    lis.append((k, sum(items)/len(items), len(items)))
   ....:     

In [24]: lis
Out[24]: [('a', 2.1666666666666665, 3), ('b', 1.3, 5)]

listがソートされていない場合は、 を使用して目的の結果を得るために、最初にソートする必要があることに注意してくださいitertools.groupby

を使用するcollections.defaultdictと、これはソートされていないアイテムでも機能します。

In [25]: from collections import defaultdict

In [26]: dic=defaultdict(list)

In [27]: for k,v in list1:
   ....:     dic[k].append(v)
   ....:     

In [28]: dic
Out[28]: defaultdict(<type 'list'>, {'a': [6.5, 6.5, -6.5], 'b': [0.0, 0.0, 6.5, -6.5, 6.5]})

In [29]: [(k,sum(v)/len(v),len(v)) for k,v in dic.items()]
Out[29]: [('a', 2.1666666666666665, 3), ('b', 1.3, 5)]
于 2013-04-21T19:22:42.973 に答える
1

醜い解決策(あなたが要求したように適切にフォーマットされていません):

list1 = [('a', 6.5),('a', 6.5),('a', -6.5),('b', 0.0),('b', 0.0),('b',6.5),('b', -6.5),('b',6.5)]

a_list = []
b_list = []
a = 0
b = 0
for item in list1:
    if 'a' in item:
        a_list.append(item[1])
        a += 1
    if 'b' in item:
        b_list.append(item[1])
        b +=1

#a is now the count of a's
#b is now the count of b's
a_avarage = reduce(lambda x, y: x + y, a_list)
b_avarage = reduce(lambda x, y: x + y, b_list)
于 2013-04-21T19:32:34.607 に答える
1

を使用しitertools.groupbyます。通常はワンライナーでしたが、平均と長さを取得するにはグループを2回消費する必要があるため、あなたの場合は少しトリッキーです:

list1 = [('a', 6.5), ('a', 6.5), ('a', -6.5), ('b', 0.0),
         ('b', 0.0), ('b', 6.5), ('b', -6.5), ('b',6.5)]

import itertools
import operator

fst = operator.itemgetter(0)
snd = operator.itemgetter(1)
result = []
for grouper, group in itertools.groupby(sorted(list1, key=fst), key=fst):
    items = map(snd, group)
    result.append((grouper, sum(items)/len(items), len(items)))
于 2013-04-21T19:26:15.233 に答える