Creating a dictionary where the key is an integer and the value is the length of a random sentence
<p>Super new to to python here, I've been struggling with this code for a while now. Basically the function returns a dictionary with the integers as keys and the values are all the words where the length of the word corresponds with each key.</p>

<p>So far I'm able to create a dictionary where the values are the total number of each word but not the actual words themselves.</p>

<p>So passing the following text</p>

<pre><code>"the faith that he had had had had an affect on his life"
</code></pre>

<p>to the function</p>

<pre><code>def get_word_len_dict(text):
    result_dict = {'1':0, '2':0, '3':0, '4':0, '5':0, '6' :0}
    for word in text.split():
        if str(len(word)) in result_dict:
            result_dict[str(len(word))] += 1
    return result_dict
</code></pre>

<p>returns</p>

<pre class="lang-none prettyprint-override"><code>1 - 0
2 - 3
3 - 6
4 - 2
5 - 1
6 - 1
</code></pre>

<p>Where I need the output to be:</p>

<pre class="lang-none prettyprint-override"><code>2 - ['an', 'he', 'on']
3 - ['had', 'his', 'the']
4 - ['life', 'that']
5 - ['faith']
6 - ['affect']
</code></pre>

<p>I think I need to have to return the values as a list. But I'm not sure how to approach it.</p>

<p>Instead of defining the default value as <code>0</code>, assign it as <code>set()</code> and within <code>if</code> condition do, <code>result_dict[str(len(word))].add(word)</code>. </p>

<p><em>Also, instead of preassigning <code>result_dict</code>, you should use <a href="https://docs.python.org/2/library/collections.html#collections.defaultdict" rel="nofollow"><code>collections.defaultdict</code></a>.</em> </p>

<p><em>Since you need non-repetitive words, I am using <a href="https://docs.python.org/2/library/functions.html#func-set" rel="nofollow"><code>set</code></a> as value instead of <code>list</code>.</em> </p>

<p>Hence, your final code should be:</p>

<pre><code>from collections import defaultdict
def get_word_len_dict(text):
    result_dict = defaultdict(set)
    for word in text.split():
        result_dict[str(len(word))].add(word)
    return result_dict
</code></pre>

<p>In case it is must that you want <code>list</code> as values (I think <code>set</code> should suffice your requirement), you need to further iterate it as:</p>

<pre><code>for key, value in result_dict.items():
    result_dict[key] = list(value)
</code></pre>

python list python-3.x dictionary