我有一个这种格式的数据集,每组数据都由一个唯一的ID(左)和一个供应商(右)组成
[('SPE8ES18V1039', '3G1W3'), ('SPE8ES18V5065', '3G1W3'), ('SPE8ES19P0173', '3MCV6'),
('SPE8ES19P0661', '0AY99'), ('SPE8ES18TTT9', '3G1W3'), ('SPE8ES18V1039', '3G1W3'),
('SPE8ES19P0173', '3MCV6'), ('SPE8ES19P0661', '0AY99')]
我想删除重复的集合并获得每个供应商的数量。因此,删除重复项后的输出将如下所示:
3G1W3 ..... 3
3MCV6 ...... 1
0AY99 ....... 1
我该如何遍历每个数据集并删除重复项并获得每个供应商ID的计数?
答案 0 :(得分:3)
将元组列表转换为字典后,您可以尝试使用collections.Counter()
,这将为您消除重复的ID。这是因为字典不能有重复的键。然后,您可以只计算字典values()
。
使用字典的实现:
from collections import Counter
l = [
("SPE8ES18V1039", "3G1W3"),
("SPE8ES18V5065", "3G1W3"),
("SPE8ES19P0173", "3MCV6"),
("SPE8ES19P0661", "0AY99"),
("SPE8ES18TTT9", "3G1W3"),
("SPE8ES18V1039", "3G1W3"),
("SPE8ES19P0173", "3MCV6"),
("SPE8ES19P0661", "0AY99"),
]
print(Counter(dict(l).values()))
# Counter({'3G1W3': 3, '3MCV6': 1, '0AY99': 1})
您也可以使用set
或frozenset
删除重复项,因为元组是可哈希的并且比字典小。
使用集合的实现:
print(Counter(y for _, y in frozenset(l)))
# Counter({'3G1W3': 3, '0AY99': 1, '3MCV6': 1})
print(Counter(y for _, y in set(l)))
# Counter({'3G1W3': 3, '0AY99': 1, '3MCV6': 1})
使用operator.itemgetter()
和map()
也可以写得很好:
from operator import itemgetter
print(Counter(map(itemgetter(1), frozenset(l))))
# Counter({'3G1W3': 3, '0AY99': 1, '3MCV6': 1})
print(Counter(map(itemgetter(1), set(l))))
# Counter({'3G1W3': 3, '0AY99': 1, '3MCV6': 1})
注意:之间的主要区别是frozenset
是不可变的,而set
是可变的。这意味着冻结集的内容在创建后不能更改,而您可以在创建后更改集。
答案 1 :(得分:1)
用于计数缩略语:
您可以使用count:
MyList = ['a','b','c','a','a','c','c'] #YOURDATA
my_dict = {i:MyList.count(i) for i in set(MyList)}
print my_dict #or print(my_dict) in python-3.x
Output : {'a': 3, 'c': 3, 'b': 1}
用于删除重复项:
MyList = ['a','b','c','a','a','c','c'] #YOURDATA
MySet = set(MyList)
MyList = list(MySet)
print(MyList)
Output : ['a','b','c']
您可以先计算重复项,然后使用以下方法删除重复项:)
答案 2 :(得分:1)
您可以这样做
l = [
("SPE8ES18V1039", "3G1W3"),
("SPE8ES18V5065", "3G1W3"),
("SPE8ES19P0173", "3MCV6"),
("SPE8ES19P0661", "0AY99"),
("SPE8ES18TTT9", "3G1W3"),
("SPE8ES18V1039", "3G1W3"),
("SPE8ES19P0173", "3MCV6"),
("SPE8ES19P0661", "0AY99"),
]
unique = {}
for i in l:
if i[0] in unique:
unique[i[0]].append(i[1])
else:
unique[i[0]] = [i[1]]
这样做,您将获得一个包含所有值映射的字典。要找到计数,您只需要这个
for j, k in unique.iteritems():
print "Element %s: %s Count" % (j, len(k))