0
:なぜ `heapq.merge(some_lists_of_iterators)`がイテレータのイテレータを返さないのですか?次のコードで
import heapq
nums = [1,2,3]
result = [set([])]
bases = []
for n in nums:
bases.append(set([n])) # Now bases is [set([1]), set([2]), set([3])]
def gen (base):
for r in result:
if base != r:
yield base | r # It yields set([]) unions base
itr1 = iter(map(gen, bases))
itr2 = heapq.merge(*map(gen, bases))
なぜITR1はイテレータのイテレータですが、ITR2は、セットのイテレータのですか?次に示すように:
for i in itr1:
print i #<generator object gen at 0x1028adcd0>
#<generator object gen at 0x1028add20>
#<generator object gen at 0x1028d5730>
for i in itr2:
print i, #set([3]) set([2]) set([1])
あなたは何を期待していましたか?なぜあなたは順序付けられていないデータに対して 'heapq.merge'を使用していますか?そして、その全体のポイントは、それが物事自体ではなく、合併しているものからアイテムをあなたに与えるということです。 – jonrsharpe
'heapq.merge'がイテラブルをソートするためには、それぞれを繰り返し処理する必要があります。これは最初に供給されたジェネレータを使い果たし、戻ってそれらを再作成する方法はありません。したがって、出力はジェネレータ自体ではなく、ジェネレータ内の項目になります。 –
@JaredGoguen返信ありがとうございます。私は 'heapq.merge'がこれらのジェネレータをマージしていると思いますか? –