gpt4 book ai didi

python - 如何以子集长度为条件迭代列表的所有分区

转载 作者:行者123 更新时间:2023-12-01 06:44:24 26 4
gpt4 key购买 nike

出于某些目的,我需要生成一个迭代器,列出列表的所有分区,但以子集长度为条件。也就是说,我想将列表划分为等长度的子集(此处=3),如果列表的长度不是 3 的倍数,则最后一个子集除外。

即['a','b','c','d','e'] 应该给出具有 2 个长度为 3 和 2 的子集的所有分区。

也就是说,如果我只是使用:

[p for p in multiset_partitions(['a','b','c','d','e'],2)]
Out:
[[['a', 'b', 'c', 'd'], ['e']],
[['a', 'b', 'c', 'e'], ['d']],
[['a', 'b', 'c'], ['d', 'e']],
.....
[['a', 'd'], ['b', 'c', 'e']],
[['a', 'e'], ['b', 'c', 'd']],
[['a'], ['b', 'c', 'd', 'e']]]

我都明白了。因此,到目前为止,我最好的尝试是过滤掉至少包含长度 > 3 的一个子集的分区:

from sympy.utilities.iterables import multiset_partitions    

def partitions(liste):
compte = 0
n = len(liste)//3 + 1
for p in multiset_partitions(liste,n):
l = len(p)
oversize = False
i = 0
while not(oversize) and i != l:
if len(p[i])>3:
oversize=True
i+=1

if oversize == False:
compte += 1

#do something with p

return(compte) #I'm just counting out the number of partitions right now

这确实有效,但显然不是实现我想要的最有效的方法。特别是当列表长度增长时,分区的数量会很快变得巨大。

(10 表示长度为 5,但 10 表示 9100,13 表示 800800...)

最有效的Python方式应该是什么?

提前致谢,

蒂埃里

最佳答案

您始终可以将 filter 包裹在分区函数周围。您可以使用 lambda 函数来确保除最后一个元素之外的所有元素的长度均为 3。

list(filter(lambda x: all(len(z)==3 for z in x[:-1]), multiset_partitions('abcde', 2)))
# returns:
[[['a', 'b', 'c'], ['d', 'e']],
[['a', 'b', 'd'], ['c', 'e']],
[['a', 'b', 'e'], ['c', 'd']],
[['a', 'c', 'd'], ['b', 'e']],
[['a', 'c', 'e'], ['b', 'd']],
[['a', 'd', 'e'], ['b', 'c']]]

选择分区数量时必须小心,以确保使用ceil。即对于 10 个项目,您需要 ceil(10/3) 而不是 10//3

关于python - 如何以子集长度为条件迭代列表的所有分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59303187/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com