![](/img/trans.png)
[英]Finding the Index of N biggest elements in Python Array / List Efficiently
[英]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.