对于嵌套二元组,我的意思是这样的:((a,b),(c,(d,e)))所有元组都有两个元素。我不需要元素的不同顺序,只需要在它们周围放置括号的不同方式。对于items = [a, b, c, d],有 5 个独特的配对,它们是:
(((a,b),c),d)
((a,(b,c)),d)
(a,((b,c),d))
(a,(b,(c,d)))
((a,b),(c,d))
Run Code Online (Sandbox Code Playgroud)
在完美的世界中,我还想控制返回元组的最大深度,这样如果我生成 的所有配对items = [a, b, c, d],max_depth=2它只会返回((a,b),(c,d))。
出现这个问题是因为我想找到一种方法来生成非交换、非关联数的加法结果。如果a+b不等于b+a,且不a+(b+c)等于(a+b)+c,a、b、c 的所有可能和是多少?
我创建了一个生成所有配对的函数,但它也返回重复项。
import itertools
def all_pairings(items):
if len(items) == 2:
yield (*items,)
else:
for i, pair in enumerate(itertools.pairwise(items)):
for pairing in all_pairings(items[:i] + [pair] + items[i+2:]):
yield pairing
Run Code Online (Sandbox Code Playgroud)
例如,它返回((a,b),(c,d))两次 for ,因为它在一种情况下将第一个配对,在第二种情况下将第一个items=[a, b, c, d]配对。(a,b)(c,d)
对于大量项目来说,返回重复项成为一个越来越大的问题。根据加泰罗尼亚数字 …