我有一个类似的清单;
[('10', '100'),
('11', '100'),
('18', '108'),
('22', '100'),
('12', '102'),
('15', '104'),
('21', '100'),
('25', '108'),
('20', '102'),
('24', '104'),
('105', '108'),
('35', '100'),
('14', '104'),
('96', '100'),
('100', '104'),
('26', '100'),
('19', '100'),
('110', '108'),
('36', '102'),
('30', '104')]
所有项目的第二个值都是唯一的“ 100”,“ 102”,“ 104”和“ 108”。
我想获取'100','102','104','108'组的前三个值。
输出应如下所示:
[('10', '100'),
('11', '100'),
('22', '100'),
('18', '108'),
('25', '108'),
('105', '108'),
('12', '102'),
('20', '102'),
('36', '102'),
('15', '104'),
('24', '104'),
('14', '104')]
我不想将列表更改为数据框并使数据框正常工作。
答案 0 :(得分:4)
您可以使用itertools.groupby
:
from itertools import groupby
new_d = [(a, list(b)) for a, b in groupby(sorted(d, key=lambda x:int(x[-1])), key=lambda x:int(x[-1]))]
result = [b for _, c in new_d for b in c[:3]]
输出:
[('10', '100'),
('11', '100'),
('22', '100'),
('12', '102'),
('20', '102'),
('36', '102'),
('15', '104'),
('24', '104'),
('14', '104'),
('18', '108'),
('25', '108'),
('105', '108')]
答案 1 :(得分:1)
您可以遍历元组列表,并使用字典来跟踪元组中第二个元素出现了多少次。然后,如果第二个值出现的次数少于3
次,只需将一个元组添加到结果列表中即可:
d = {}
n = 3
out = []
for i,j in l:
if d.setdefault(j,0) < n:
d[j]+= 1
out.append((i,j))
print(out)
[('10', '100'),
('11', '100'),
('18', '108'),
('22', '100'),
('12', '102'),
('15', '104'),
('25', '108'),
('20', '102'),
('24', '104'),
('105', '108'),
('14', '104'),
('36', '102')]
答案 2 :(得分:1)
一种替代方法是对字典中的键的外观进行简单计数,然后对其进行排序(例如,假设输入数据与问题相同):
from collections import defaultdict
from itertools import count
from operator import itemgetter
counts = defaultdict(lambda: count(0))
result = [(value, key) for value, key in data if next(counts[key]) < 3]
print(sorted(result, key=itemgetter(1)))
输出
[('10', '100'), ('11', '100'), ('22', '100'), ('12', '102'), ('20', '102'), ('36', '102'), ('15', '104'), ('24', '104'), ('14', '104'), ('18', '108'), ('25', '108'), ('105', '108')]
有关更多详细信息,请参见count,defaultdict和itemgetter。