簡體   English   中英

如何在 Python 中有效地從 n 元素集的列表中制作 n+1 元素集的列表?

[英]How do I make a list of sets of n+1 elements out of a list of sets of n elements efficiently in Python?

假設我有一個包含兩個元素的集合列表。 我想從中構建一個包含三個元素的列表。

例如,我的輸入列表是 [{1, 2}, {2, 3}, {1, 3}, {3, 4}, {4, 5}]。

我想要一個 output 包含扁平輸入列表中所有可能的三個集合。 那是,

[{1, 2, 3}, {1, 2, 4}, {1, 2, 5}, {1, 3, 5}, {1, 3, 4}, {1, 4, 5} {2 , 3, 4}, {2, 3, 5}, {3, 4, 5}, {2, 4, 5}]

我運行以下代碼嘗試使用 pandas 和 itertools 庫函數來執行此操作:

def build_sets(item_list, set_size):
    flattened_item_list = list(set(flatten(item_list)))
    combinations = itertools.combinations(range(len(flattened_item_list)), set_size)
    return_list = []
    for i in combinations:
        combination_element = []
        for j in i:
            combination_element.append(flattened_item_list[j])
        return_list.append(set(combination_element))
    return return_list

這里的 set_size 指的是所需 output 列表中每個集合的大小。 此代碼對於較小的輸入足夠好,但如果輸入列表包含數千個集合,則代碼需要很長時間才能運行。

除了足夠快地輸入一萬個元素的順序外,我如何嘗試完成相同的任務?

謝謝你。

你把它復雜化了。 只需直接生成您的值的組合,無需 go 通過使用索引:

from itertools import combinations

data = [{1, 2}, {2, 3}, {1, 3}, {3, 4}, {4, 5}]
distinct = set.union(*data)

out = [set(c) for c in combinations(distinct, r=3)]

print(out)
# [{1, 2, 3}, {1, 2, 4}, {1, 2, 5}, {1, 3, 4}, {1, 3, 5}, {1, 4, 5}, {2, 3, 4}, {2, 3, 5}, {2, 4, 5}, {3, 4, 5}]

因此,您的 function 將只是:

def build_sets(item_list, set_size):
    distinct = set.union(*item_list)
    return [set(c) for c in combinations(distinct, r=set_size)]

由於返回的列表可能相當大,您可能希望使用生成器來逐個生成集合:

def sets_generator(item_list, set_size):
    distinct = set.union(*item_list)
    for c in combinations(distinct, r=set_size):
        yield set(c)

並像這樣使用它:

for s in sets_generator(data, 3):
    print(s)

Output:

{1, 2, 3}
{1, 2, 4}
{1, 2, 5}
{1, 3, 4}
{1, 3, 5}
{1, 4, 5}
{2, 3, 4}
{2, 3, 5}
{2, 4, 5}
{3, 4, 5}

暫無
暫無

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

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