首页 > 解决方案 > 计算元素,然后删除重复项

问题描述

所以我发现对元素进行分组和计数的最简单方法是通过itertools.

我有这个“员工部门”列表(例如会计、采购、营销等),超过 500 个。其中的一个示例是:

# employee number, first name, last name, department, rate, age, birthdate

201601005,Raylene,Kampa,Purchasing,365,15,12/19/2001,; 
200909005,Flo,Bookamer,Human Resources,800,28,12/19/1957,; 
200512016,Jani,Biddy,Human Resources,565,20,8/7/1966,; 
199806004,Chauncey,Motley,Admin,450,24,3/1/2000

我打算做的是计算某个部门下的所有员工,然后删除重复项。它应该看起来像(例如):

Accounting: 97
Marketing: 34
Purchasing: 45

该列表隐含为一个模块,因此我无法使用 CSV 读取它。以下是我的代码itertools

import empDataLT as x
from itertools import groupby

#Departments
def dept():
    empDept = list() #converting empDataLT to list
    for em in x.a:
        empEm = em.strip().split(",")
        empDept.append(empEm)
    e = sorted(empDept, key=lambda x: x[3]) #sort data alphabetical
    b = []
    c = []
    for s in e:
        new_b = []
        new_c = []
        for value, repeated in groupby(s[3]):
            new_b.append(value)
            new_c.append(sum(1 for _ in repeated))
        b.append(new_b)
        c.append(new_c)
    print(b)
    print(c)

其中import empDataLT是作为模块隐含的 500 条记录列表。但是,此代码会产生以下结果:

[['A', 'c', 'o', 'u', 'n', 't', 'i', 'n', 'g'], [['A', 'c', 'o', 'u', 'n', 't', 'i', 'n', 'g'],
[[1, 2, 1, 1, 1, 1, 1, 1, 1], [1, 2, 1, 1, 1, 1, 1, 1, 1],

是的,显然它计算的是部门的信件。我仍在学习 Python,所以我不太确定如何修复它或任何解决方法。先感谢您!干杯。

PS:empData 是一个字符串,但应该被视为一个列表。

还有一件事,如果不是太多要求,这也需要它检查哪个部门的员工人数最多。但这不是那么重要。我可以找这个。:D

标签: pythonpython-3.x

解决方案


使用 groupby 很好,但需要排序。

使用 acollections.defaultdict完全避免排序:

s = """201601005,Raylene,Kampa,Purchasing,365,15,12/19/2001,; 
200909005,Flo,Bookamer,Human Resources,800,28,12/19/1957,; 
200512016,Jani,Biddy,Human Resources,565,20,8/7/1966,; 
199806004,Chauncey,Motley,Admin,450,24,3/1/2000"""


data = [ i.strip().split(",") for i in s.split(";")]

from collections import defaultdict
grpd_data = defaultdict(list)

for d in data:
    grpd_data[d[3]].append(d)


print(grpd_data)
print()

# sort by lenght of list descending and enumerate it:
for idx,(key,value) in enumerate(sorted(grpd_data.items(), key=lambda i:-len(i[1])), 1):
    print(idx,key,value,len(value))

输出(手动格式化):

 defaultdict(<class 'list'>, {
    'Purchasing': [['201601005', 'Raylene', 'Kampa', 'Purchasing', '365', '15', '12/19/2001', '']], 
    'Human Resources': [[' 200909005', 'Flo', 'Bookamer', 'Human Resources', '800', '28', '12/19/1957', ''], 
                        [' 200512016', 'Jani', 'Biddy', 'Human Resources', '565', '20', '8/7/1966', '']], 
    'Admin': [[' 199806004', 'Chauncey', 'Motley', 'Admin', '450', '24', '3/1/2000']]})

# with counts and sorted
1 Human Resources [[' 200909005', 'Flo', 'Bookamer', 'Human Resources', '800', '28', '12/19/1957', ''], 
                   [' 200512016', 'Jani', 'Biddy', 'Human Resources', '565', '20', '8/7/1966', '']] 2
2 Purchasing      [['201601005', 'Raylene', 'Kampa', 'Purchasing', '365', '15', '12/19/2001', '']] 1
3 Admin           [[' 199806004', 'Chauncey', 'Motley', 'Admin', '450', '24', '3/1/2000']] 1

编辑 - 更大的数据:

big = s
for _ in range(200):
    big += ";"+s

s = big 

data = [ i.strip().split(",") for i in s.split(";")]

from collections import defaultdict
gr = defaultdict(list)

for d in data:
    gr[d[3]].append(d)


for idx,(key,value) in enumerate(sorted(gr.items(), key=lambda i:-len(i[1])),1):
    print(idx, len(value))

输出:

1 402
2 201
3 201

推荐阅读