Pythonでシーケンスのすべての「順序付けられたサブセット」(正しい数学用語を使用していない場合は謝罪)を生成する必要があります。省略された要素はNone
.Given[1, 2]
に置き換えられ[(1, 2), (1, None), (None, 2), (None, None)]
ます。各「順序付けられたサブセット」は、各位置で、シードシーケンスとまったく同じ要素であるか、であるというプロパティを持っている必要がありますNone
。
以下を使用すると、要素が省略されたサブセットをかなり簡単に生成できます。
from itertools import combinations
for length in xrange(len(items), 0, -1):
for combination in combinations(items, length):
yield combination
しかし、欠落している要素を再構築する最も効果的な方法が何であるかを理解することはできません。私の最初の考えは、次のようなことをすることです。
from itertools import combinations
indexes = range(len(items))
for length in xrange(len(items), 0, -1):
for combination in combinations(indexes, length):
yield tuple(items[i] if i in combination else None for i in indexes)
誰かがこれの明らかな欠陥を見つけることができるかどうか、または私が逃したより効率的な解決策があるかどうか疑問に思っています。(items
はかなり短いリストであり、通常は10要素未満であるため、内部ループでの「組み合わせ」のO(N)検索については気にしません)。