Python - 无序元组频率统计
在本文中,我们将输入作为元组列表,目标是打印唯一元组的频率,但顺序无关紧要。顺序无关紧要意味着元组 (1,2,3) 和 (1,3,2) 将被视为相同,即使它们的顺序不同。
例如,考虑以下情况:
输入
[(1, 2, 3), (2, 1, 3), (4, 5, 6), (1, 2, 3), (3, 2, 1)]
输出
2
解释
索引为 0、1、3 和 4 的元组相同,因此频率计数增加 1。索引为 2 的元组 (4,5,6) 是唯一的,因此频率计数再次增加 1。因此,唯一元组的总数为 2。
方法一:使用集合存储唯一元组
集合推导式迭代“data”列表中的每个元组。
在推导式中,我们对每个元组进行排序;因此,新的元组出现,其元素以升序排列。
代码执行三个主要任务:首先显示原始“data”列表;然后,它计算并显示此“data”列表中唯一元组的数量;重要的是,由于排序步骤,它将具有相同元素但顺序不同的类似元组视为不同的元组。
示例
data = [(1, 2, 3), (2, 1, 3), (4, 5, 6), (1, 2, 3), (3, 2, 1)] unique_tuples_set = set(tuple(sorted(item)) for item in data) print("Input List:", data) print("Frequency of unique tuples =", len(unique_tuples_set))
输出
Input List: [(1, 2, 3), (2, 1, 3), (4, 5, 6), (1, 2, 3), (3, 2, 1)] Frequency of unique tuples = 2
方法二:使用字典过滤唯一元组
我们迭代输入列表,每个元素(实际上是一个元组)都转换为排序后的元组。此过程涉及创建一个字典,其中:键成为排序后的元组;值保持为原始元组。
随后,我们将排序后的元组作为键添加到字典中;同时,我们分配其对应的值——原始元组。
示例
data = [(1, 2, 3), (2, 1, 3), (4, 5, 6), (1, 2, 3), (3, 2, 1)] unique_tuples_dict = {tuple(sorted(item)): item for item in data} print("Input List:", data) print("Frequency of unique tuples =", len(unique_tuples_dict))
输出
Input List: [(1, 2, 3), (2, 1, 3), (4, 5, 6), (1, 2, 3), (3, 2, 1)] Frequency of unique tuples = 2
方法三:使用简单的循环和条件语句
我们初始化一个空列表;这是为了容纳唯一元组。
然后我们迭代输入列表——我们将每个元组转换为排序后的元组。
随后,我们验证排序后的元组——如果它不在我们的唯一元组列表中,我们将追加它。
示例
data = [(1, 2, 3), (2, 1, 3), (4, 5, 6), (1, 2, 3), (3, 2, 1)] unique_tuples_list = [] for item in data: unique_tuple = tuple(sorted(item)) if unique_tuple not in unique_tuples_list: unique_tuples_list.append(unique_tuple) print("Input List:", data) print("Frequency of unique tuples =", len(unique_tuples_list))
输出
Input List: [(1, 2, 3), (2, 1, 3), (4, 5, 6), (1, 2, 3), (3, 2, 1)] Frequency of unique tuples = 2
方法四:使用自定义函数
在这里,我们定义了我们独特的函数——一个专门用于消除重复元组的工具。
在这个函数中,我们生成一个空列表——这用于存储唯一元组。
然后,我们进行以下过程:迭代输入列表;依次将每个元组转换为排序后的元组。
接下来,我们评估排序后的元组是否已存在于我们的唯一元组列表中——如果不存在,我们将其追加。
最后,我们检索唯一元组的列表——然后,通过打印其长度(也表示唯一元组的频率)来返回它。
示例
data = [(1, 2, 3), (2, 1, 3), (4, 5, 6), (1, 2, 3), (3, 2, 1)] def remove_duplicate_tuples(data_list): unique_tuples = [] for item in data_list: unique_tuple = tuple(sorted(item)) if unique_tuple not in unique_tuples: unique_tuples.append(unique_tuple) return unique_tuples unique_tuples_list = remove_duplicate_tuples(data) print("Input List:", data) print("Frequency of unique tuples =", len(unique_tuples_list))
输出
Input List: [(1, 2, 3), (2, 1, 3), (4, 5, 6), (1, 2, 3), (3, 2, 1)] Frequency of unique tuples = 2
方法五:使用 itertools.groupby
我们在这里从 itertools 模块导入 groupby 函数。
然后我们对输入列表进行排序——此过程取决于每个元组的排序版本。
接下来,我们使用 groupby 迭代排序后的列表。
有效地删除重复项,我们从每个组中提取第一个项目;最后,我们打印频率。
示例
data = [(1, 2, 3), (2, 1, 3), (4, 5, 6), (1, 2, 3), (3, 2, 1)] from itertools import groupby def remove_duplicate_tuples_groupby(data_list): data_list.sort(key=lambda x: sorted(x)) unique_tuples = [next(group) for key, group in groupby(data_list, key=lambda x: sorted(x))] return unique_tuples unique_tuples_list = remove_duplicate_tuples_groupby(data) print("Input List:", data) print("Frequency of unique tuples =", len(unique_tuples_list))
输出
Input List: [(1, 2, 3), (2, 1, 3), (4, 5, 6), (1, 2, 3), (3, 2, 1)] Frequency of unique tuples = 2
方法六:使用集合和冻结集合
下面的代码主动创建一个名为“unique_tuples_set”的唯一集合;它最初是空的。
集合推导式是它的首选工具——它遍历“data”列表中的每个元组。
在推导式中——每个元组都被转换为一个冻结集合——一个不可变的集合。
代码执行两个主要功能:首先,它打印原始“data”列表;其次,它计算并输出在此“data”列表中找到的唯一元组的数量。但是,由于使用了冻结集合,因此应用了等价原则,其中如果元组包含相似的元素,则无论其排列如何,都将它们视为相同的元组。
示例
data = [(1, 2, 3), (2, 1, 3), (4, 5, 6), (1, 2, 3), (3, 2, 1)] unique_tuples_set = {frozenset(item) for item in data} print("Input List:", data) print("Frequency of unique tuples =", len(unique_tuples_set))
输出
Input List: [(1, 2, 3), (2, 1, 3), (4, 5, 6), (1, 2, 3), (3, 2, 1)] Frequency of unique tuples = 2
方法七:使用循环和集合来跟踪唯一元组
我们实例化一个空集合——这作为一个容器,我们在其中存储唯一元组。
接下来——我们开始迭代输入列表。
将每个元组转换为排序版本;随后,将其添加到集合中。
显示输入列表——随后,指示集合的大小:这有效地演示了唯一元组的频率。
示例
data = [(1, 2, 3), (2, 1, 3), (4, 5, 6), (1, 2, 3), (3, 2, 1)] unique_tuples = set() for item in data: unique_tuple = tuple(sorted(item)) unique_tuples.add(unique_tuple) print("Input List:", data) print("Frequency of unique tuples =", len(unique_tuples))
输出
Input List: [(1, 2, 3), (2, 1, 3), (4, 5, 6), (1, 2, 3), (3, 2, 1)] Frequency of unique tuples = 2
方法八:使用 collections.Counter 和列表推导式
Python 的 collections 模块主动枚举“data”中唯一元组的频率;特别是,它使用其 Counter 功能。
在计数之前,它对每个元组中的元素进行排序;这确保了对等效元组(即使是元素顺序不同的元组)的统一处理。
随后,代码执行两个操作:它打印原始“data”列表;此外,它计算(将排序后的元素视为等效元组)此列表中唯一元组的数量。
示例
data = [(1, 2, 3), (2, 1, 3), (4, 5, 6), (1, 2, 3), (3, 2, 1)] from collections import Counter unique_tuples_counter = Counter(tuple(sorted(item)) for item in data) print("Input List:", data) print("Frequency of unique tuples =", len(unique_tuples_counter))
输出
Input List: [(1, 2, 3), (2, 1, 3), (4, 5, 6), (1, 2, 3), (3, 2, 1)] Frequency of unique tuples = 2
结论
在本文中,我们介绍了打印列表中唯一元组频率的不同方法(顺序无关紧要)。演示的方法包括集合、字典、列表推导式、自定义函数、itertools、冻结集合、循环和 collections.Counter,每种方法都有其自身的优缺点。这些方法不仅帮助我们找到频率,还帮助我们练习一般的编程和 Python 技能。