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

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.