---
# System prepended metadata

title: Python / collections
tags: [PyPi, collections, Python, Counter, defaultdict]

---

Python / collections
===
###### tags: `Python`
###### tags: `Python`, `PyPi`, `collections`, `defaultdict`, `Counter`

<br>

[TOC]

<br>


## Q&A
### defaultdict 簡單範例
- ### Question
    ```
    from collections import defaultdict
    ```
    請給予 defaultdict 簡單範例
- ### ChatGPT3.5
    collections 模塊中的 defaultdict 是一種特殊的字典（dict）類型，它允許你指定當字典查找不存在的鍵時，應該返回什麼默認值。這是一個簡單的示例：

    ```python=
    from collections import defaultdict

    # 創建一個 defaultdict，並指定默認值為 int 的 0
    counter = defaultdict(int)

    # 向 defaultdict 中添加元素，如果鍵不存在，默認值 0 會被自動設置
    counter["apple"] += 1
    counter["banana"] += 2
    counter["cherry"] += 3

    print(counter)  # defaultdict(<class 'int'>, {'apple': 1, 'banana': 2, 'cherry': 3})

    # 如果查找不存在的鍵，將返回默認值 0
    print(counter["date"])  # 0
    ```
    在這個示例中，我們創建了一個 `defaultdict`，並將默認值設置為整數 `int` 的 0。然後，我們向 `counter` 添加了一些元素，並查找了一個不存在的鍵。當查找不存在的鍵時，`defaultdict` 會返回默認值 0，而不會引發 KeyError。這使得 `defaultdict` 在計數和分組等應用中非常有用。你可以根據需要設置不同的默認值類型。

<br>

### Counter
- ### Question
    Python 是否有提供 counter 相關套件？
    i.e. 累計某個項目的數量
- ### ChatGPT-4o
    Python 的標準庫中包含一個非常實用的模塊，名為 `collections`，其中的 `Counter` 類專門用於計數。`Counter` 是一個子類化自字典的容器，用於計數可哈希對象（hashable objects）。它本質上是一個哈希表，對象作為鍵，它們的計數作為鍵值。

    `Counter` 可以用來計數各種對象（包括字元、單詞、列表項目等），並且支持快速簡單地計數元素出現的次數。

    ### 使用 Counter 的例子
    下面是一個使用 `collections.Counter` 來計數一組元素出現次數的例子：

    ```python=
    from collections import Counter

    # 創建一個列表
    items = ['apple', 'orange', 'banana', 'apple', 'orange', 'apple', 'kiwi']

    # 使用 Counter 來計數列表中每個元素的出現次數
    counter = Counter(items)

    # 輸出計數結果
    print(counter)  # Counter({'apple': 3, 'orange': 2, 'banana': 1, 'kiwi': 1})

    # 獲取某個元素的計數
    print(counter['apple'])  # 輸出 3

    # 更新計數
    counter.update(['apple', 'orange', 'kiwi', 'kiwi'])
    print(counter)  # 更新後的計數 Counter({'apple': 4, 'kiwi': 3, 'orange': 3, 'banana': 1})

    # 查找出現最多的元素
    print(counter.most_common(1))  # 輸出 [('apple', 4)]
    ```
    ### `Counter` 的常用方法
    - **`elements()`** - 返回一個迭代器，其中包含每個元素重複計數次數的所有元素。
    - **`most_common([n])`** - 返回一個列表，其中包含 n 個最常見的元素及其計數，從最常見到最少。
    - **`update([iterable-or-mapping])`** - 從一個可迭代對象或者映射對象更新元素的計數。
    
    `Counter` 是一種非常方便且高效的方式來處理計數問題，在數據分析和處理時特別有用。它的接口簡單直觀，易於使用，且功能強大。

    ### 補充
    ```python=
    most_freq_item_list = sorted(
        counter.items(),
        key=lambda item: item[1], reverse=True
    )
    for item in most_freq_item_list:
        print(item)
    ```
    等同
    ```python=
    for item in counter.most_common():
        print(item)
    ```
    執行結果：
    ```
    ('apple', 4)
    ('orange', 3)
    ('kiwi', 3)
    ('banana', 1)
    ```
