2016-05-25 5 views
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]) 
+1

あなたは何を期待していましたか?なぜあなたは順序付けられていないデータに対して 'heapq.merge'を使用していますか?そして、その全体のポイントは、それが物事自体ではなく、合併しているものからアイテムをあなたに与えるということです。 – jonrsharpe

+1

'heapq.merge'がイテラブルをソートするためには、それぞれを繰り返し処理する必要があります。これは最初に供給されたジェネレータを使い果たし、戻ってそれらを再作成する方法はありません。したがって、出力はジェネレータ自体ではなく、ジェネレータ内の項目になります。 –

+0

@JaredGoguen返信ありがとうございます。私は 'heapq.merge'がこれらのジェネレータをマージしていると思いますか? –

答えて

0

あなたが変更しようとしたことがあり:

itr1 = iter(map(gen, bases)) 
itr2 = heapq.merge(*map(gen, bases)) 

をする:

itr1 = iter(map(gen, bases)) 
itr2 = iter(heapq.merge(*map(gen, bases))) 
関連する問題