[Tutor] A dictionary question

dn PyTutor at DancesWithMice.info
Fri Nov 19 16:27:20 EST 2021


On 19/11/2021 18.00, Phil wrote:
> 
>> The collections.Counter behaves like a dictionary.  Same methods
>> should work.  So, try something like these basic loops that take
>> advantage of the items() method.
>>
>>    c = Counter({(4, 6): 2, (3, 4): 1, (3, 6): 1})
>>       # -- loop through all of the key, value items in the dict-like
>> object
>>    for k, v in c.items():
>>        print( k, v)
>>
>>    # -- same but only print where the counter for that entry is 2
>>    for k, v in c.items():
>>        if v == 2:
>>            print( k, v)
> 
> Thank you Martin that solved that problem, however, it hasn't help me
> solve the original problem. I've spent a week or more on this and I
> don't seem to be getting anywhere. I'm now wondering if I really need to
> use a dictionary and if I'm really attacking this problem correctly.
> 
> The problem is, given a list of sets find a pair of numbers that occur
> in the same row and in no other set in that row.
> 
> row = [{7,3},{5},{4,6,8},{7,8},{1},{9,3},{7,9},{4,6,3},{2}]
> 
> The pair in this set is {4, 6}. This is an easy one to solve because
> neither the 4 nor the 6 is in any other set. My clumsy code gave me the
> correct answer but it fails if the 4 or the 6 is repeated in another row
> set.
> 
> There is no solution for the follow row because there is no unique pair:
> 
> row = [{5},{6},{3},{4,7,5},{1,2,4,5},{1,7,5},{1,2,4,7,9},{8},{1,2,4,7,9}]
> 
> I just had a bright idea while I'm typing this and the following code
> almost offer a complete solution:
> 
> row = [{7,3},{5},{4,6,8},{7,8},{1},{9,3},{7,9},{4,6,3},{2}]
> 
> number_list = []
> row_list = []
> 
> for r in range(9):
>     for i in range(1, 10):
>         if i in row[r] and len(row[r]) > 2:
>             number_list.append(i)
>             row_list.append(r)
> 
> for i in range(len(number_list)):
>     print(number_list[i], end=' ')
> 
> print()
> 
> for i in range(len(row_list)):
>     print(row_list[i], end=' ')
> 
> At this point I have:
> 
> 4 6 8 3 4 6
> 2 2 2 7 7 7
> 
> What I need to do now is feed this result into a function that returns
> the  tuple (4, 6). This is just for my own education and is not homework.


This problem has all the flavor of self-flagellation!

Some relief may be available through "Chapter 8 - Advanced Iterators" of
Mark Pilgrim's (online) book "Dive into Python 3"
(https://diveintopython3.net/index.html).

Whilst not identical, the example used is quite similar, in requiring
pattern-matching techniques across "collections". Thus, 'beg, borrow, or
steal' ideas/algorithms to solve this problem...

Also, you may find the book as an whole, an useful adjunct to whatever
learning-tool currently employed...
-- 
Regards,
=dn


More information about the Tutor mailing list