2017-03-24 9 views
1

私はitertoolsを使用して組み合わせを生成しており、すべての組み合わせを印刷しようとしています。
forループとリストの両方の理解がこの単純なタスクで失敗します。ループがアイテムを印刷しない

In [1]: from itertools import combinations 

In [2]: combos = combinations(range(3), 2) 

In [3]: list(combos) 
Out[3]: [(0, 1), (0, 2), (1, 2)] 

In [4]: for comb in combos: 
    ...:  print(comb) 

In [5]: [comb for comb in combos] 
Out[5]: [] 

なぜすべての組み合わせが表示されないのですか?

+2

イテレータです。あなたは 'list(combos)'でそれを使い果たしました。その後、ゼロ要素があるので、表示するための 'comb 'は残っていません。 – TemporalWolf

+0

'list(combos)'を単に表示して空でないことを示します。 – Peaceful

+0

@TemporalWolf:True !!私はとても愚かです! – Peaceful

答えて

3

iteratorです。あなたはlist(combos)でそれを使い果たしました。それは、ゼロ要素を持っているので、何combは表示に残っていませんその後:

>>> import itertools 
>>> combos = itertools.combinations(range(3),2) 
>>> combos 
<itertools.combinations object at 0x0000000004BB66D8> 
>>> list(combos) 
[(0, 1), (0, 2), (1, 2)] 
>>> combos.next() 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
StopIteration 
>>> len(combos) 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
TypeError: object of type 'itertools.combinations' has no len() 

combosないリストです。それはiterator ...そしてすべての条件を終えると、StopIteration例外がスローされますが、list comprehensionfor loopは両方ともStopIterationに終わります。そのため、0回だけ実行されます。

あなたが、しかし、行うことができます。リストとリストに変換します

combos = list(itertools.combinations(range(3),2)) 

が無期限に横断することができます。

0

問題は、リスト(コンボ)がコンビネーションを空にしたように思えることです。

>>> combos = combinations(range(3), 2) 
>>> list(combos) 
[(0, 1), (0, 2), (1, 2)] 
>>> list(combos) 
[] 

したがって、リストとして宣言して解析する必要があります。

>>> from itertools import combinations 
>>> combos = combinations(range(3), 2) 
>>> combo_list = list(combos) 
>>> for comb in combo_list:  
...  print(comb) 
... 
(0, 1) 
(0, 2) 
(1, 2) 
>>> 
>>> [comb for comb in combo_list] 
[(0, 1), (0, 2), (1, 2)]