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 技能。
資料結構
網路
關係型資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP