我有两个列表如下。我从数据库
获取此信息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中执行此操作。
答案 0 :(得分: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})
答案 1 :(得分: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}
答案 2 :(得分: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))]
答案 3 :(得分: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)
答案 4 :(得分:0)
你可以zip这两个列表,它们将第一个元素与第二个元素的元素配对成元组。然后循环遍历它们并使用元组的第一部分作为字典中的键:
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答案 5 :(得分: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
答案 6 :(得分: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))