python - 计算元素,然后删除重复项
问题描述
所以我发现对元素进行分组和计数的最简单方法是通过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
解决方案
使用 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
推荐阅读
- c# - C#将数组传递给数组但仍然出现“无法从'string []'转换为'string'”错误
- python - Python数组和numpy数组组合
- python - 我需要像我想要的示例中所示的那样打印
- javascript - 如何格式化过滤的字符串并返回格式化的值?香草 JS 循环
- reactjs - 如何在 React JS 中使用 dj-rest-auth 执行 Google 社交认证
- sql - 对于参数为 n 的 B+-tree,如果文件中有 Ksearch-key 值,证明树高 h 的以下界限
- java - JPA 使用来自嵌套类的 id
- python - 如何使用 Python 请求处理过期的 SSL/TLS 证书?
- android - 如何测试 viewModelScope 控制的 SharedFlow?
- javascript - VisualStudio Code 自动完成功能不适用于 JavaScript