1

我有两个如下列表。我是从数据库中获取的

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 中的相应值应收集并添加(总和)。

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

如果元素按您在示例中显示的顺序排列,则可以使用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)]

事实上你不需要创建两个单独的列表并在以后压缩它

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 回答
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 回答
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

您可以压缩这两个列表,将第一个列表的元素与第二个列表的元素配对成元组。然后遍历它们并使用元组的第一部分作为字典中的键:

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

如果要保留 Emps 的顺序,您可能需要使用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 回答