Random and Itertools
<p>I have some sample code that iterates through two different ranges of numbers successfully, but I want to add functionality to it so that it moves through the chained ranges randomly like so:</p>

<pre><code>import itertools
import random

for f in random.sample(itertools.chain(range(30, 54), range(1, 24)), 48):

    print f
</code></pre>

<p>However this produces the following error:</p>

<pre><code>Traceback (most recent call last):
  File "&lt;pyshell#12&gt;", line 1, in &lt;module&gt;
    for f in random.sample(itertools.chain(range(30, 54), range(1, 24)), 48):
  File "G:\Python27\lib\random.py", line 321, in sample
    n = len(population)
TypeError: object of type 'itertools.chain' has no len()
</code></pre>

<p>Can anyone advise the amendments needed to make this function as intended?</p>

<p>As the <a href="https://docs.python.org/3/library/random.html#random.sample" rel="nofollow"><code>random.sample</code></a> documentation states,</p>

<blockquote>
  <p>Returns a <em>k</em> length list of unique elements chosen from the population sequence or set</p>
</blockquote>

<p>It requires a sequence or a set so that it can sample from the entire population, but <a href="https://docs.python.org/3/library/itertools.html#itertools.chain" rel="nofollow"><code>itertools.chain</code></a> returns an iterator which could even be infinite. So <code>sample</code> cannot determine the actual size of the population. That is why you are getting this error.</p>

<p>To fix this, you can simply create a list or a tuple and pass it to <code>sample</code>, like this</p>

<pre><code>for f in random.sample(list(itertools.chain(range(30, 54), range(1, 24))), 48)
</code></pre>

<hr>

<p><strong>Note:</strong> The other problem in your code is that, the sampling quantity cannot be bigger than the actual population.</p>

<pre><code>&gt;&gt;&gt; len(range(30, 54))
24
&gt;&gt;&gt; len(range(1, 24))
23
</code></pre>

<p>So the population size is 47 and you are sampling 48 elements.</p>

python random itertools sample