📜  Python – 保留出现 N 次 K 的记录(1)

📅  最后修改于: 2023-12-03 15:04:11.752000             🧑  作者: Mango

Python – 保留出现 N 次 K 的记录

有时候在数据处理过程中,需要仅保留出现 N 次 K 的记录。在 Python 中,可以使用 defaultdict 和 Counter 两个类来轻松处理此类问题。

defaultdict

defaultdict 是 collections 模块中的一个类,它是一种特殊的字典,当字典中的键不存在时,会创建一个默认值(默认为 0)。

我们可以使用 defaultdict 来计算每个记录的出现次数,然后筛选出出现 N 次的记录。

from collections import defaultdict

data = [('a', 1), ('b', 2), ('a', 3), ('c', 4), ('b', 5)]

counts = defaultdict(int)
for key, value in data:
    counts[key] += 1

result = [(key, value) for key, value in data if counts[key] == 2]

print(result)

输出结果为:

[('b', 2), ('b', 5)]

上面的代码中,我们首先定义了一个包含记录的列表 data,然后使用 defaultdict 创建了一个名为 counts 的字典,用于计算每个记录出现的次数。接着,我们遍历列表 data 中的每个元素,并将对应键的计数器加一。最后,我们使用列表推导式从 data 中筛选出出现 N 次(这里是 2 次)的记录。

Counter

Counter 是 collections 模块中的另一个类,它是一个计数器,用于统计可迭代对象中每个元素出现的次数。和 defaultdict 一样,Counter 也可以用于计算每个记录的出现次数,然后筛选出出现 N 次的记录。

from collections import Counter

data = [('a', 1), ('b', 2), ('a', 3), ('c', 4), ('b', 5)]

counts = Counter([key for key, value in data])

result = [(key, value) for key, value in data if counts[key] == 2]

print(result)

输出结果和前面的例子相同:

[('b', 2), ('b', 5)]

上面的代码中,我们首先创建一个名为 counts 的 Counter,用于计算每个记录出现的次数。具体来说,我们使用列表推导式将数据中的键收集到一个列表中,然后将这个列表作为参数传递给 Counter。接着,我们使用列表推导式从 data 中筛选出出现 N 次(这里是 2 次)的记录。

总结

使用 defaultdict 或 Counter 类,可以用几行代码轻松处理出现 N 次 K 的记录这类问题。如果您还不熟悉这两个类,建议先阅读官方文档,以便更好地掌握它们的用法。