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 技能。

更新于:2023年11月2日

浏览量:205

开启你的职业生涯

完成课程获得认证

开始学习
广告