Python:列表添加

时间:2012-11-17 09:30:11

标签: python list add

我有两个列表如下。我从数据库

获取此信息
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中执行此操作。

7 个答案:

答案 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))