0
list_pairs = str(zip(GetEmpID[row],Duration[row]))

上記の関数から、次のような結果が得られます。ここ1046,8008,8011EmpID's1.0,2.3などが値です。

[(u'1046', 1.0)]
[(u'8008', 2.3)]
[(u'8008', 2.2)]
[(u'8011', 1.3)]

結果は次のようになります。EmpIDが同じ場合は、その要素を追加(合計)します。Pythonでこれを行う方法。

[(u'1046', 1.0)]
   total = 1.0    

[(u'8008', 2.3)]
[(u'8008', 2.2)] 
   total = 4.5

[(u'8011', 1.3)]
   total = 1.3
4

3 に答える 3

3
answer = []
for empId, entries in itertools.groupby(sorted(list_pairs, key=operator.itemgetter(0)), key=operator.itemgetter(0)):
    answer.append((empId, sum(entry[1] for entry in entries)))


In [17]: list_pairs = [(u'1046', 1.0), (u'8008', 2.3), (u'8008', 2.2), (u'8011', 1.3)]

In [18]: answer = []

In [19]: for empId, entries in itertools.groupby(sorted(list_pairs, key=operator.itemgetter(0)), key=operator.itemgetter(0)):
   ....:     answer.append((empId, sum(entry[1] for entry in entries)))
   ....:     

In [20]: answer
Out[20]: [(u'1046', 1.0), (u'8008', 4.5), (u'8011', 1.3)]

これを読みやすくするには:

answer = []
list_pairs.sort(key=operator.itemgetter(0))
groups = itertools.groupby(list_pairs, key=operator.itemgetter(0))
for empId, entries in groups:
    answer.append((empId, sum(entry[1] for entry in entries)))
于 2012-11-29T06:02:11.113 に答える
0

1行で実行して出力する必要がある場合は、これを試してください。

data=[(u'1046', 1.0), (u'8008', 2.2999999999999998), (u'8008', 2.2000000000000002), (u'8011', 1.3)]
import itertools
[(key, sum(x for _,x in value))for key, value in itertools.groupby(data, lambda x: x[0])]
于 2012-11-29T11:07:58.337 に答える
0

現在の EmpID とその EmpID の現在までの値の合計を含む変数を保持します。EmpID が変更されたら、それを出力します (または代わりにリストに保存します)。

list_pairs = str(zip(GetEmpID[row],Duration[row]))
last=""
last_sum=0
for empid, value in list_pairs:
    if empid!=last:
        if last:
            print last, last_sum
        last, last_sum= empid, 0
    else:
        last_sum+=value
print last, last_sum
于 2012-11-29T06:05:06.450 に答える