[Tutor] Rearranging a list of numbers with corresponding index

Ken G. beachkidken at gmail.com
Fri Mar 13 15:43:01 CET 2015



On 03/13/2015 10:21 AM, Peter Otten wrote:
> Ken G. wrote:
>
>> I have been keeping track of numbers drawn in our local lotto drawings
>> into a list format as shown in a short example below. Using such list, I
>> am able to determine how often a number appears within the last 100 plus
>> drawings.
>>
>> The length of my lists range from 5, 15, 35, 59and 75 long. I will give
>> an example of one of my short list.
>>
>> PowerPlay = [0, 0, 61, 32, 11, 14]
>>
>> Disregarding index 0 and 1, I can see and print the following:
>>
>> Index    Number
>> 2 61
>> 3 32
>> 4     11
>> 5     14
>>
>> showing that number 2 appears 61 times, number 3 appears 32 times,
>> number 4 appears 11 times and number 5 appears 14 times within last 100
>> plus drawings.
>>
>> How I best rearrange the numbers from high to low with its corresponding
>> index number such as below:
>>
>> Number Index
>> 61                2
>> 32                3
>> 14 5
>> 11     4
>>
>> showing the number 2 appears 61 times, number 3 appears 32 times, number
>> 5 appears 14 times and number 4 appears 11 times. I know that using
>>
>> MegaBall.reverse()
>>
>> sort the number from high to low but the index numbers still remain in
>> the same positions.
>>
>> Thanks for pointing out the way to do this.
> The initial list:
>
>>>> power_play = [0, 0, 61, 32, 11, 14]
> Use enumerate() to get index, frequency pairs:
>
>>>> list(enumerate(power_play))
> [(0, 0), (1, 0), (2, 61), (3, 32), (4, 11), (5, 14)]
>
> Sort the pairs:
>
>>>> sorted(enumerate(power_play))
> [(0, 0), (1, 0), (2, 61), (3, 32), (4, 11), (5, 14)]
>
> Provide a key to sort after the second value, i. e. the frequency in the
> (index, frequency) pairs:
>
>>>> def second_value(item):
> ...     return item[1]
> ...
>>>> sorted(enumerate(power_play), key=second_value)
> [(0, 0), (1, 0), (4, 11), (5, 14), (3, 32), (2, 61)]
>
> Note that instead of writing your own custom function or lambda you could
> also use operator.itemgetter(1) from the operator module in the stdlib.
>
> Sort in reverse order:
>
>>>> sorted(enumerate(power_play), key=second_value, reverse=True)
> [(2, 61), (3, 32), (5, 14), (4, 11), (0, 0), (1, 0)]
>
>
> Print the output for frequencies > 0:
>
>>>> pairs = sorted(enumerate(power_play), key=second_value, reverse=True)
>>>> for index, freq in pairs:
> ...     if freq == 0:
> ...         break
> ...     print(freq, index, sep="\t")
> ...
> 61      2
> 32      3
> 14      5
> 11      4
>
>
Wow! Thanks! Printing this out and will be studying it completely. 
Again, thanks.

Ken


More information about the Tutor mailing list