簡體   English   中英

按等效類將列表中的元素分組

[英]Grouping elements in list by equivalence class

嘗試通過應用集合從一個列表中創建新列表時遇到問題。

假設我有以下列表:

L=[[(a),(b),(c)],[(b),(c),(a)],[(a),(c),(b)],[(a),(d),(b)]]

我只想從L中具有相同元素的列表中創建一個列表。 我們可以清楚地看到:

[(a),(b),(c)], [(b),(c),(a)] and [(a),(c),(b)] 

當視為集合時,它們是相同的,因為它們都共享元素(a),(b)和(c)。

因此,如果我希望根據以下規則從L創建新列表:

然后,我需要兩個新列表,它們是:

[(a),(b),(c)] and [(a),(d),(b)]

以來

[(a),(d),(b)] 

被視為一組與其他列表不同。

這樣做的最佳方法是什么? 我知道如何將L內的元素轉換為一個集合,但是如果我希望應用此規則以便僅創建兩個獨立的列表,該怎么辦?

set frozenset可以大致為您提供frozenset的東西(盡管它不會保留順序):

unique_sets = {frozenset(lst) for lst in L}

盡管在set轉換中順序丟失了,但是轉換回list list很簡單:

unique_lists = [list(s) for s in unique_sets]

您可以制作一set frozenset以僅獲取唯一集合,而忽略項目的順序和計數:

set(map(frozenset, L))
# {frozenset({'a', 'd', 'b'}), frozenset({'a', 'c', 'b'})}

然后將它們轉換回列表很簡單:

list(map(list, set(map(frozenset, L))))
# [['a', 'd', 'b'], ['a', 'c', 'b']]

如果您願意為set編寫一個hash方法,則可以執行以下操作:

import itertools
[k for k, g in itertools.groupby(sorted([set(y) for y in x], key = your_hash))]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM