[Tutor] Alice_in_wonderland Question

Jake Blank jakenblank at gmail.com
Mon May 5 04:38:01 CEST 2014


Hi,

I finally got it.
This was the code:
for k in sorted(word_count, key=lambda x:word_count[x], reverse=True):
                print (k, word_count[k])

The only question i have now is how to limit the amount of returns the
program runs to the first 15 results.




On Sun, May 4, 2014 at 10:19 PM, Brian van den Broek <
brian.van.den.broek at gmail.com> wrote:

> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20140504/ca0e42b3/attachment.html>


More information about the Tutor mailing list