在Python字典中对项目进行分组,然后在组中挑出这些项目

时间:2013-07-26 18:24:21

标签: python defaultdict

我甚至不确定我的措辞是否正确,但我很难绕过这个问题。我有一组数据,描述,个人和数字。有些人可能在不同的群体中。有些可以有相同的描述。示例可能如下所示:

GROUP A       DESCRIPTION A       PERSON A       NUMBER
GROUP A       DESCRIPTION A       PERSON B       NUMBER
GROUP B       DESCRIPTION A       PERSON C       NUMBER
GROUP C       DESCRIPTION B       PERSON A       NUMBER

我想要完成的是为组/描述中的每个人获得一定百分比。首先,我遍历数据并添加到数组中。然后我用它来创建一个defaultdict。

for row in data:
    l.append([group, description, person, number])

d = defaultdict(int)
for item in l:
    d[item[0], item[1]] += item[2]

for k,v in d.iteritems():
    print k,v

>>(group, description) (sum of numbers)

我需要做的就是让我感到困惑的地方。这是我正在使用的一个实际例子:

GROUP A       DESCRIPTION A       PERSON A       1.14
GROUP A       DESCRIPTION A       PERSON B       1.14
GROUP A       DESCRIPTION A       PERSON C       0.36
GROUP A       DESCRIPTION A       PERSON D       1.07

所以我得到了这些数字的总和,3.71。我的下一步是在该组中选择一个人,并将他们的人数除以他们的总人数。使用PERSON C作为上述组中的一个例子,那么我会得到0.36 / 3.71 = 0.097。我不知道如何把它放到我的代码中,但它似乎应该不难 - 但我只是没有看到它。在此之后我还有其他几个步骤,但我想一旦我知道如何获得这个特定的百分比,我就可以解决其余问题。

2 个答案:

答案 0 :(得分:1)

data = [
['GROUP A'  ,     'DESCRIPTION A'      , 'PERSON A'  ,       1.14],
['GROUP A'  ,     'DESCRIPTION A',       'PERSON B',       1.14],
['GROUP A'  ,     'DESCRIPTION A' ,      'PERSON C',       0.36],
['GROUP A'  ,     'DESCRIPTION A'  ,     'PERSON D',       1.07],
]


total_score = sum([x[3] for x in data])
target_person = 'PERSON C'
the_score = [ x[3]/total_score for x in data if x[2] == target_person]
print(the_score)

答案 1 :(得分:0)

from collections import namedtuple 
personEntry = namedtuple('entry', ['group', 'description', 'person', 'data')

# allEntries is a list in personEntries
groupSum = lambda groupKey: sum ([i.data for i in allEntries if i.group == groupKey])

groupTotals = {}
for key in ['Group A', 'Group B', 'Group C']:
    groupTotals[key] = groupSum[key]

percentage = lambda entry: entry.data / groupTotals[entry.group]

for eachEntry in allEntries:
    print eachEntry.person, percentage(eachEntry)