使用 Python 將子列表按另一個列表分組


在 Python 中,我們可以使用多種方法將子列表按另一個列表分組,例如使用字典和使用 itertools.groupby() 函式,以及使用巢狀列表推導式。將子列表按另一個列表分組在分析大型資料集和資料分類時非常有用。它也用於文字分析和自然語言處理。在本文中,我們將探討在 Python 中使用不同方法將子列表按另一個列表分組,並瞭解它們的實現。

方法 1:使用字典

字典可以以非常直接的方式用於在 Python 中將子列表按另一個列表分組。讓我們透過一個示例來了解使用字典將子列表按另一個列表分組。

語法

list_name.append(element)

這裡,元素是要新增到列表末尾的元素。append 方法將此元素放在列表的末尾。

示例

在下面的示例中,我們定義了一個名為 group_sublists 的函式,它接受兩個引數:sublists(子列表的列表)和 grouping_list(決定分組順序的列表)。在函式內部,我們建立了一個空的字典 groups 來儲存按其鍵分組的子列表。我們遍歷 sublists 列表中的每個子列表。假設每個子列表的第一個元素是鍵,我們提取它並檢查它是否存在於 groups 字典中。如果存在,我們將當前子列表追加到該鍵的現有子列表列表中。否則,我們在 groups 字典中建立一個新的鍵值對,其中鍵是鍵,當前子列表是值。最後,我們返回一個列表推導式,該推導式按 grouping_list 指定的順序檢索分組的子列表。

def group_sublists(sublists, grouping_list):
    groups = {}

    for sublist in sublists:
        key = sublist[0]  # Assuming the first element of each sublist is the key
        if key in groups:
            groups[key].append(sublist)
        else:
            groups[key] = [sublist]

    return [groups[key] for key in grouping_list]

# Example usage
sublists = [[1, 'apple'], [2, 'banana'], [1, 'orange'], [2, 'grape']]
grouping_list = [1, 2]

result = group_sublists(sublists, grouping_list)
print(result)

輸出

[[[1, 'apple'], [1, 'orange']], [[2, 'banana'], [2, 'grape']]]

方法 2:使用 itertools.groupby() 函式

Python 的 itertools 模組提供了一個名為 groupby() 的便捷函式,可用於基於鍵函式對元素進行分組。讓我們透過一個示例來了解這一點。

語法

list_name.append(element)

這裡,append() 函式是用於將元素新增到 list_name 末尾的列表方法。它透過將指定的元素作為新項新增到列表中來修改原始列表。

itertools.groupby(iterable, key=None)

這裡,iterable 是輸入可迭代物件,可以是您要分組的任何序列,並且key=None 是一個可選引數,可以是可以用作分組鍵的函式。如果未提供鍵函式,則元素本身將用作分組的鍵。

示例

在下面的示例中,我們首先根據鍵(假設它是第一個元素)對子列表進行排序。然後,我們建立一個名為 result 的空列表來儲存分組的子列表。接下來,我們遍歷 itertools.groupby() 生成的組。groupby() 函式接受兩個引數:可迭代物件(在本例中為 sublists)和鍵函式(一個提取每個子列表鍵的 lambda 函式)。它返回鍵和包含分組子列表的迭代器的對。在迴圈內部,我們檢查鍵是否存在於 grouping_list 中。如果存在,我們使用 list(group) 將迭代器轉換為列表並將其追加到 result 列表中。最後,我們返回包含分組子列表的 result 列表。

import itertools

def group_sublists(sublists, grouping_list):
    sublists.sort(key=lambda x: x[0])  # Sort the sublists based on the key

    result = []
    for key, group in itertools.groupby(sublists, lambda x: x[0]):
        if key in grouping_list:
            result.append(list(group))

    return result

# Example usage
sublists = [[1, 'apple'], [2, 'banana'], [1, 'orange'], [2, 'grape']]
grouping_list = [1, 2]

result = group_sublists(sublists, grouping_list)
print(result)

輸出

[[[1, 'apple'], [1, 'orange']], [[2, 'banana'], [2, 'grape']]]

方法 3:使用巢狀列表推導式

我們可以使用 Python 編寫巢狀列表推導式,可用於將子列表按另一個列表分組。讓我們看一個示例以瞭解如何實現這一點。

語法

[expression for item in list if condition]

這裡,語法由方括號組成,方括號包含一個表示式,後跟一個迭代列表的 for 迴圈。任何 if 條件也可以新增到表示式的末尾以過濾掉某些元素。

示例

在下面的示例中,我們定義了函式group_sublists,它將 sublists 和 grouping_list 作為引數。我們使用巢狀列表推導式來遍歷 grouping_list 中的每個鍵。對於每個鍵,我們遍歷子列表並僅過濾出具有匹配鍵(假設它是第一個元素)的子列表。然後將這些過濾後的子列表收集到一個新列表中,表示該鍵的分組子列表。結果是一個列表的列表,其中每個子列表包含特定鍵的分組子列表。

def group_sublists(sublists, grouping_list):
    return [
        [sublist for sublist in sublists if sublist[0] == key]
        for key in grouping_list
    ]

# Example usage
sublists = [[1, 'apple'], [2, 'banana'], [1, 'orange'], [2, 'grape']]
grouping_list = [1, 2]

result = group_sublists(sublists, grouping_list)
print(result)

輸出

[[[1, 'apple'], [1, 'orange']], [[2, 'banana'], [2, 'grape']]]

結論

在本文中,我們討論瞭如何在 Python 中將子列表按另一個列表分組。我們討論了三種方法:使用字典和利用 itertools.groupby() 函式,以及使用巢狀列表推導式。每種方法都有其優點,並且根據程式的具體要求可能更適合。

更新於: 2023-07-17

556 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告