[Tutor] Alice_in_wonderland Question

Brian van den Broek brian.van.den.broek at gmail.com
Mon May 5 04:19:38 CEST 2014


Hi Jake,

Please do be sure to use Reply All rather than just Reply. I'm sending
my reply and and quotes from yours to the list; that way, others can
follow along, learn and help.

Also, in general, reply under the messages to which you respond,
ideally trimming what isn't needed away. (You will see that is what I
have done below.)  Yes, that's not how email is used outside of
technical circles. I'd maintain the technical circles's preference for
not top posting is right. But, right or wrong, it is what those whom
you are asking for free help prefer, so it is prudent to do it,
gritting your teeth if you must :-)

On 4 May 2014 21:36, Jake Blank <jakenblank at gmail.com> wrote:
> Hey Thanks for responding.
>
> So now my code looks like this:
> from wordtools import extract_words
>
> source_filepath=input("Enter the path to the source file:")
> dest_filepath =input("Enter the path to the destination file:")
>
> sourcef=open(source_filepath, 'r')
> destf=open(dest_filepath, 'w')
> for line in sourcef:
>         destf.write(line)
> file=input ("Would you like to process another file?(Y/N):")
> if file== "Y":
>     source_filepath=input("Enter the path to the source file:")
>     dest_filepath =input("Enter the path to the destination file:")
> else:
>         word_count = {}
> file = open (source_filepath, 'r')
> full_text = file.read().replace('--',' ')
> full_text_words = full_text.split()
>
> for words in full_text_words:
>         stripped_words = words.strip(".,!?'`\"- ();:")
>         try:
>             word_count[stripped_words] += 1
>         except KeyError:
>             word_count[stripped_words] = 1
>
> ordered_keys = word_count.keys()
> sorted(ordered_keys)
> print ('This is the output file for Alice in Wonderland')
> for k in sorted(ordered_keys):
>     print (k, word_count[k])
>
> The first part about the user specifying the file is a little off but
> besides that I am able to return all of the words in the story with the
> number of times they occur alphabetically.  In order to return the sorted
> list by number of times that each word occurs I am a little confused if i
> have to change something in my print statement?  I understand how i have to
> sort the words by their associated values i'm confused where in my code i
> would do that.
>
> Thanks, Jake

> On Sun, May 4, 2014 at 9:16 PM, Brian van den Broek
> <brian.van.den.broek at gmail.com> wrote:
>>
>> On May 4, 2014 8:31 PM, "Jake Blank" <jakenblank at gmail.com> wrote:


<snip Jake's original question>


>> Hi Jake,
>>
>> You are sorting the dictionary keys by the keys themselves, whereas
>> what you want is the keys sorted by their associated values.
>>
>> Look at the key parameter in
>> https://docs.python.org/3.4/library/functions.html#sorted.
>>
>> To get you started, here is an example in the vicinity:
>>
>> >>> data = ['abiab', 'cdocd', 'efaef', 'ghbgh']
>> >>> sorted(data)
>> ['abiab', 'cdocd', 'efaef', 'ghbgh']
>> >>> sorted(data, key=lambda x:x[2])
>> ['efaef', 'ghbgh', 'abiab', 'cdocd']
>> >>> def get_third(x): return x[2]
>> ...
>> >>> sorted(data, key=get_third)
>> ['efaef', 'ghbgh', 'abiab', 'cdocd']
>> >>>
>>
>> In case the lambda version is confusing, it is simply a way of doing
>> the get_third version without having to create a function outside of
>> the context of the sorted expression.
>>
>> If that sorts you, great. If not, please do ask a follow-up. (I was
>> trying not to do it for you, but also not to frustrate by giving you
>> too little of a push.)


So, the code in your second message didn't seem to reflect any changes
in light of the hint I gave. Did you not see how to apply it? If so,
that's fine. But, rather than leave me guessing, it would be better to
say; that way I, or others in the thread, can better direct efforts to
help.

Does this help more?

>>> data = {'a':2, 'b':4, 'c':3, 'd':1}
>>> sorted(data,key=lambda x:data[x])
['d', 'a', 'c', 'b']
>>> sorted(data,key=lambda x:data[x])
['d', 'a', 'c', 'b']
>>> data = {'a':2, 'b':4, 'c':3, 'd':1}
>>> sorted(data)
['a', 'b', 'c', 'd']
>>> sorted(data,key=lambda x:data[x])
['d', 'a', 'c', 'b']
>>> for letter in sorted(data,key=lambda x:data[x]):
...   print(letter, data[letter])
...
d 1
a 2
c 3
b 4
>>> for letter in sorted(data,key=lambda x:data[x],reverse=True):
...   print(letter, data[letter])
...
b 4
c 3
a 2
d 1
>>>

Can you see how key=lambda x:data[x] is forcing the sort to consider
not the keys of the dictionary, but their associated values?

Best,

Brian vdB


More information about the Tutor mailing list