iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
佛心分享-刷題不只是刷題

正拳的 Leetcode 150系列 第 4

[Day 4] 善用 Python 的 collections - Counter

  • 分享至 

  • xImage
  •  

探索 Python 的 collections 模組

在 Python 中,collections 模組提供了一組高效的資料結構,這些資料結構擴展了內建類別如 listdict 的功能,讓我們在處理常見的資料操作時更加方便。以下是這些資料結構的簡單介紹:

namedtuple()

namedtuple() 是一個用來創建具名欄位的 tuple 子類別的工廠函式。它可以讓我們像使用屬性一樣訪問 tuple 中的值,這樣比起一般的 tuple 更具有可讀性。

from collections import namedtuple

Point = namedtuple('Point', ['x', 'y'])
p = Point(11, 22)
print(p.x, p.y)  # 輸出 11, 22

deque

deque(雙端隊列)是一個類似 list 的容器,它允許在兩端快速地進行元素的添加(append)與移除(pop),比起 list 在頭部操作的效率更高。

from collections import deque

d = deque(['a', 'b', 'c'])
d.append('d')  # 在尾部添加
d.appendleft('z')  # 在頭部添加
print(d)  # deque(['z', 'a', 'b', 'c', 'd'])

ChainMap

ChainMap 是一個將多個 dict 物件合併為單一視圖的容器,這在需要同時檢視多個對映(mapping)時非常實用。

from collections import ChainMap

dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
chain = ChainMap(dict1, dict2)
print(chain['b'])  # 輸出 2(來自 dict1)

Counter

Counterdict 的子類別,用來統計可雜湊物件的數量。這在需要計算元素出現次數時非常便利,例如統計字串中每個字母出現的頻率。

from collections import Counter

c = Counter('abracadabra')
print(c)  # Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})

OrderedDict

OrderedDictdict 的子類別,能記錄元素被插入的順序。雖然從 Python 3.7 開始,標準的 dict 也保證了插入順序,但在某些應用中 OrderedDict 仍然有其特定用途。

from collections import OrderedDict

od = OrderedDict()
od['a'] = 1
od['b'] = 2
od['c'] = 3
print(od)  # OrderedDict([('a', 1), ('b', 2), ('c', 3)])

defaultdict

defaultdictdict 的子類別,當訪問的鍵不存在時,它會使用一個工廠函數自動提供預設值,避免 KeyError。

from collections import defaultdict

dd = defaultdict(int)  # 預設值是 0
dd['a'] += 1
print(dd)  # defaultdict(<class 'int'>, {'a': 1})

UserDict, UserList, UserString

這三個類別分別是 dictliststr 的包裝器,目的是簡化自訂類別的過程。它們提供了一個更乾淨的方式來擴展這些基礎類別,適合在需要自定義行為時使用。


Leetcode 第三題:Valid Anagram

接下來,讓我們來看 Leetcode 的第三題——Valid Anagram。這是一道經典的字串問題,要求我們判斷兩個字串是否為字母異位詞(Anagram),也就是兩個字串中的字母及其出現次數完全相同。

題目描述:

給定兩個字串 st,如果它們是字母異位詞,則返回 True,否則返回 False

範例:

s = "anagram"
t = "nagaram"
# 輸出: True

s = "rat"
t = "car"
# 輸出: False

解法思路:

  1. 可以使用 collections.Counter 來統計兩個字串中每個字母出現的次數,然後比較這兩個 Counter 物件是否相等。

  2. 如果字母的出現次數完全一致,則它們是異位詞,返回 True,否則返回 False

Python 解法:

from collections import Counter

def is_anagram(s: str, t: str) -> bool:
    return Counter(s) == Counter(t)

# 測試
print(is_anagram("anagram", "nagaram"))  # True
print(is_anagram("rat", "car"))  # False

這道題的時間複雜度是 O(n),其中 n 是字串的長度。使用 Counter 可以讓我們很方便地完成這樣的計數任務。

與 LLM 互動

我們還可以藉助 LLM(大型語言模型)來解答一些程式相關的問題。例如,我們可以提問:

Python 有什麼系統函式可以用來「統計兩個字串中每個字母出現的次數」?

以下是 ChatGPT 的回答:

在 Python 中,可以使用 collections.Counter 來統計兩個字串中每個字母出現的次數。Counter 是一個非常方便的資料結構,能夠輕鬆統計可迭代物件(如字串、列表等)中每個元素出現的次數。

今天我們介紹了 Python 的 collections 模組,並且實作了 Leetcode 上的字母異位詞問題。希望這些工具和範例能幫助你在日常開發中處理各種集合和字串操作!敬請期待更多內容!


上一篇
[Day 3] 善用 Python 基本資料結構:dictionary
下一篇
[Day 5] 善用 Python 的 collections - deque
系列文
正拳的 Leetcode 1506
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言