1

私は以下のような2つのリストを持っています。私はこれをデータベースから取得しています

EmpID = Assign.objects.select_related().filter(pName=selProject).filter()
    .order_by('laEmpNum').values_list('laEmpNum', flat=True)

TotDur = Assign.objects.select_related().filter(pName=selProject).order_by('laEmpNum')
    .values_list('duration', flat=True)

EmpID = [u'1046', u'1046', u'1046', u'8008', u'8008', u'8011'] 

TotDur = [0.0, 2.0, 2.5, 0.0, 2.7, 1.2] 

EmpIDが同じである場合、TotDurの対応する値は収集してadd(sum)する必要があります。

ResOne = 0.0 + 2.0 + 2.5    i.e 4.5
ResTwo = 0.0+2.7            i.e 2.7
ResThr = 1.2                i.e 1.2

Pythonでこれを行う方法。

4

7 に答える 7

3

defaultdictは使用するのに適したデータ構造です。intフィールドの場合、新しいキーの値を想定し、0バケットを簡単に収集できます。

from collections import defaultdict
d = defaultdict(int)
for i, j in zip(EmpID, TotDur):
    d[i] += j
print d # defaultdict(<type 'int'>, {u'8008': 2.7, u'1046': 4.5, u'8011': 1.2})
于 2012-11-17T09:39:33.283 に答える
2

あなたが使用することができますdefaultdict

In [60]: from collections import *

In [61]: EmpID = [u'1046', u'1046', u'1046', u'8008', u'8008', u'8011']

In [62]: TotDur = [0.0, 2.0, 2.5, 0.0, 2.7, 1.2]

In [63]: d=defaultdict(int)

In [64]: for x,y in zip(EmpID,TotDur):
    d[x]+=y
   ....:     

In [65]: d
Out[65]: defaultdict(<type 'int'>, {u'8008': 2.7, u'1046': 4.5, u'8011': 1.2})

または単にdict

In [70]: d=dict()

In [71]: for x,y in zip(EmpID,TotDur):
    d[x]=d.get(x,0)+y
   ....:     

In [72]: d
Out[72]: {u'1046': 4.5, u'8008': 2.7, u'8011': 1.2}
于 2012-11-17T09:37:25.747 に答える
2

例で示したように要素が正しい場合は、itertools.groupbyを使用できます。

from itertools import groupby
from operator import itemgetter
[(k , sum(e for _,e in v)) for k,v in groupby(zip(EmpID, TotDur), itemgetter(0))]
[(u'1046', 4.5), (u'8008', 2.7), (u'8011', 1.2)]

実際、2つの別々のリストを作成して後でzipする必要はありません。

Emp_TotDur = Assign.objects.select_related().filter(pName=selProject).filter()
    .order_by('laEmpNum').values_list('laEmpNum', 'duration')

[(k , sum(e for _,e in v)) for k,v in groupby(Emp_TotDur, itemgetter(0))]
于 2012-11-17T09:42:24.233 に答える
0

あなたはこのようにそれを行うことができます

l1 = [1,1,2,3,3]
l2 = [1,2,3,4,5]
last_val=l1[0]
sum=0
list=[]
for pair in zip(l1,l2): 
    if pair[0]!=last_val:
        print(sum)
        list.append(sum)
        sum=0
    last_val=pair[0]
    sum+=pair[1]
list.append(sum)
print(list)
于 2012-11-17T09:39:34.067 に答える
0

最初の要素と2番目の要素を組み合わせてタプルにする2つのリストを圧縮できます。次に、それらをループして、タプルの最初の部分を辞書のキーとして使用します。

EmpID = [u'1046', u'1046', u'1046', u'8008', u'8008', u'8011']
TotDur = [0.0, 2.0, 2.5, 0.0, 2.7, 1.2]
Result = {}

for (key, value) in zip(EmpID, TotDur):
    if not key in Result:
        Result[key] = value
    else:
        Result[key] += value

# Print the result
for (key, value) in Result.items():
    print key, value

Empの順序を保持したい場合は、 OrderedDictを使用することをお勧めします

于 2012-11-17T09:40:47.000 に答える
0

これを試してください。対応するすべてのidの値の合計がリストに追加されます。後で、empIdを使用してリストにアクセスし、その合計を確認できます。

finalList = []
lastEmpId

for index, emp in enumarate(EmdIP):
    if lastEmpId == emp:
        finalList[lastEmpId] += TotDur[index]
    else:
        finalList[lastEmpId] = TotDur[index]
    lastEmpId = emp;

print finalList
于 2012-11-17T09:44:24.163 に答える
0
    python 3.2
    res=[]
    for i in set(ID):
         b=[]
         for x,y in enumerate(ID):
              if i==y: b.append(T[x])
    res.append(sum(b))
于 2012-11-17T18:15:03.563 に答える