python中:过滤掉DICT列表中某些属性未充分表示的元素
我有一份字典清单python中:过滤掉DICT列表中某些属性未充分表示的元素,python,Python,我有一份字典清单 [ {'x': 1, 'cat': 1}, {'x': 1, 'cat': 1}, {'x': 1, 'cat': 2}, {'x': 1, 'cat': 1}, {'x': 1, 'cat': 2}, {'x': 1, 'cat': 1}, {'x': 1, 'cat': 2}, {'x': 1, 'cat': 3}] 我需要过滤掉“cat”值出现次数太少的元素 如果我将最小实例数设置为2,则在上面的列表中,包含“
[ {'x': 1, 'cat': 1},
{'x': 1, 'cat': 1},
{'x': 1, 'cat': 2},
{'x': 1, 'cat': 1},
{'x': 1, 'cat': 2},
{'x': 1, 'cat': 1},
{'x': 1, 'cat': 2},
{'x': 1, 'cat': 3}]
我需要过滤掉“cat”值出现次数太少的元素
如果我将最小实例数设置为2,则在上面的列表中,包含“cat”:3的实例应该被过滤掉,因为“cat”:3在列表中只存在一次,那么“cat”:1和“cat”:2的实例就足够了
输出应该是
[ {'x': 1, 'cat': 1},
{'x': 1, 'cat': 1},
{'x': 1, 'cat': 2},
{'x': 1, 'cat': 1},
{'x': 1, 'cat': 2},
{'x': 1, 'cat': 1},
{'x': 1, 'cat': 2}]
我不关心顺序,我需要保留原始词典您可以使用这些词典检查类别的频率,并从足够频繁的类别中构建一个集合:
[ {'x': 1, 'cat': 1},
{'x': 1, 'cat': 1},
{'x': 1, 'cat': 2},
{'x': 1, 'cat': 1},
{'x': 1, 'cat': 2},
{'x': 1, 'cat': 1},
{'x': 1, 'cat': 2},
{'x': 1, 'cat': 3}]
import collections
source = [{'x': 1, 'cat': 1},
{'x': 1, 'cat': 1},
{'x': 1, 'cat': 2},
{'x': 1, 'cat': 1},
{'x': 1, 'cat': 2},
{'x': 1, 'cat': 1},
{'x': 1, 'cat': 2},
{'x': 1, 'cat': 3}]
minimum_count = 2
category_counts = collections.Counter(item['cat'] for item in source)
# category_counts == {1: 4, 2: 3, 3: 1}
frequent_categories = {
category for category, count in category_counts.items()
if count > minimum_count
}
# frequent_categories == {1, 2}
result = [item for item in source if item['cat'] in frequent_categories]
您可以尝试以下代码:
l = [
{'x': 1, 'cat': 1},
{'x': 1, 'cat': 1},
{'x': 1, 'cat': 2},
{'x': 1, 'cat': 1},
{'x': 1, 'cat': 2},
{'x': 1, 'cat': 1},
{'x': 1, 'cat': 2},
{'x': 1, 'cat': 3}
]
from collections import Counter
def select(l, times):
counters = Counter(map(lambda x : x['cat'], l)).most_common(times)
return filter(lambda item: item['cat'] in dict(counters) , l)
print select(l, 2)
决定某一类别是否代表性不足的标准是什么?如果它只出现一次?如果最多出现n次?它是列表中代表性最低的吗?类别应该至少出现n次这是我第一次尝试,想知道是否存在一些不同的类别approach@JackNova这个解决方案有什么你不喜欢的地方吗?@JackNova没有,我的意思是,有不同的方法,如果你能告诉我你不喜欢这个解决方案的地方,我会告诉你(或某人)肯定能想出一个更适合你需要的答案。@JackNove…或者如果你真的对其他答案不再感兴趣,你介意将这个答案标记为已接受吗?谢谢!