(Feb-21-2021, 04:09 PM)new_coder_231013 Wrote: Hi,
This is my second post on any sort of coding website and I'm an absolute beginner at programming. I'm trying to learn Python and am currently about halfway through an introductory book in which the author presents a block of code showing how to test the "evenness" of the randint function in Python using a dictionary (taking the range of numbers from 1 to 10 as an example). I'm having trouble figuring out exactly what is going on in this code. Here it is:
frequency = {} for i in range(1000): num = randint(1, 10) if frequency.has_key(num): frequency[num] = frequency[num] + 1 else: frequency[num] = 1 print frequencyThe output from this code is given in the book as follows:
The author writes that "It's not perfectly even, but most statisticians would be happy with our result."
Output:{1: 99, 2: 105, 3: 93, 4: 114, 5: 81, 6: 95, 7: 82, 8: 116, 9: 118, 10: 97}
Here is what I think the code is doing:
The first line defines the "frequency" variable as an empty dictionary.
The second and third lines generate a random number between 1 and 10 1,000 times (I think).
The lines after this with the "if ... else" statement have me a bit stumped. It seems to me that the "if frequency.has_key(num)" criterion will always be met, so the resulting frequency of each number will always have 1 added to it. Why? Does this have something to do with the fact that the range function in Python increments by 1 by default? I'm having trouble understanding how the "if ... else" statement helps generate a frequency distribution for numbers 1 to 10.
Also, if I'm correct that the "if frequency.has_key(num)" criterion will always be met, is the "else" statement at the end of the block of code even necessary?
Thanks in advance for any help.
I corrected lines 6 and 7. They were indented one step too far.
Most of your assumptions are correct but when the dictionary "frequency" is created it is empty so if you you just use line 5:
frequency[num] = frequency[num] + 1you will get an error as the key, so far, does not exist. Line 7:
frequency[num] = 1on the other hand, introduces the key. You could, of course create the dictionary with all the keys and a zero value for each of them but that is a bit tedious, so most people do as in the given code, maybe with line 5 as
frequency[num] += 1. If you want to simplify the loop then this would do the trick:
frequency = dict((el,0) for el in range(1,11)) for i in range(1000): frequency[randint(1, 10)] +=1 print(frequency)where the first line creates a dictionary with ten keys, 1..10, and sets the value to zero for each of them.