【发布时间】:2018-02-10 13:33:44
【问题描述】:
我想获得一个 k 大小的元组列表,其中包含一个元素列表的组合(我们称之为elements),类似于itertools.combinations_with_replacement(elements, k) 所做的事情。不同之处在于我想为每个元素的替换数量添加一个最大值。
例如,如果我运行以下命令:
elements = ['a', 'b']
print(list(itertools.combinations_with_replacement(elements, 3)))
我明白了:
[('a', 'a', 'a'), ('a', 'a', 'b'), ('a', 'b', 'b'), ('b', 'b', 'b')]
我想要以下内容:
elements = {'a': 2, 'b': 3}
print(list(combinations_with_max_replacement(elements, 3)))
哪个会打印
[('a', 'a', 'b'), ('a', 'b', 'b'), ('b', 'b', 'b')]
请注意,每个元组中'a' 的最大数量是2,因此('a', 'a', 'a') 不是结果的一部分。
我宁愿避免循环遍历 itertools.combinations_with_replacement(elements, k) 计算每个元组中的元素并将它们过滤掉的结果。
如果我可以提供更多信息,请告诉我。
感谢您的帮助!
更新
我试过了:
elements = ['a'] * 2 + ['b'] * 3
print(set(itertools.combinations(elements, 3)))
然后得到:
{('a', 'b', 'b'), ('b', 'b', 'b'), ('a', 'a', 'b')}
我得到了我需要的元素,但我失去了顺序,看起来有点老套
【问题讨论】:
-
使用
set本质上只是通过迭代删除重复项... -
是的,这是正确的,所以我没有任何进展
-
我刚刚发布了一个不使用任何过滤的解决方案