0

A= list(itertools.product([0, 1], repeat=n))たとえば、1と0のみを含むすべてのnタプルを作成できます 。A最初に多くのタプルを作成してから削除せずに、1 が 0 よりも多くないすべてのタプルを効率的に作成するにはどうすればよいですか?

4

2 に答える 2

2

それらをリストに保持する前に、オンザフライで削除します。

A = [x for x in itertools.product([0, 1], repeat=n) if sum(x)*2<=n]

それらを生成することが、アルゴリズム全体の「難しい」部分であるとは思えません。したがって、タプルの不要な半分を 1 より多く生成するための 2 倍のオーバーヘッドについて心配する必要はありません。

さらに、リストは N が大きいと大量のメモリを消費することに注意してください。常にジェネレーターを使用することもできます。

記録のために:私の最初の試みはpython 2.xでのみ機能し、3.xのitertools.ifilter()は単純にfilter()になります。

A = list(itertools.ifilter(
          lambda x:sum(x)*2<=n, 
          itertools.product([0, 1], repeat=n)))
于 2013-09-27T09:45:07.750 に答える