On Thursday, December 20, 2012 12:03:21 AM UTC+13, Steven D'Aprano wrote: > On Wed, 19 Dec 2012 02:45:13 -0800, dgcosgrave wrote: > > > > > Hi Iam just starting out with python...My code below changes the txt > > > file into a list and add them to an empty dictionary and print how often > > > the word occurs, but it only seems to recognise and print the last entry > > > of the txt file. Any help would be great. > > > > > > tm =open('ask.txt', 'r') > > > dict = {} > > > for line in tm: > > > line = line.strip() > > > line = line.translate(None, '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~') > > > line = line.lower() > > > list = line.split(' ') > > > > Note: you should use descriptive names. Since this is a list of WORDS, a > > much better name would be "words" rather than list. Also, list is a built- > > in function, and you may run into trouble when you accidentally re-use > > that as a name. Same with using "dict" as you do. > > > > Apart from that, so far so good. For each line, you generate a list of > > words. But that's when it goes wrong, because you don't do anything with > > the list of words! The next block of code is *outside* the for-loop, so > > it only runs once the for-loop is done. So it only sees the last list of > > words. > > > > > for word in list: > > > > The problem here is that you lost the indentation. You need to indent the > > "for word in list" (better: "for word in words") so that it starts level > > with the line above it. > > > > > if word in dict: > > > count = dict[word] > > > count += 1 > > > dict[word] = count > > > > This bit is fine. > > > > > else: > > > dict[word] = 1 > > > > But this fails for the same reason! You have lost the indentation. > > > > A little-known fact: Python for-loops take an "else" block too! It's a > > badly named statement, but sometimes useful. You can write: > > > > > > for value in values: > > do_something_with(value) > > if condition: > > break # skip to the end of the for...else > > else: > > print "We never reached the break statement" > > > > So by pure accident, you lined up the "else" statement with the for loop, > > instead of what you needed: > > > > for line in tm: > > ... blah blah blah > > for word in words: > > if word in word_counts: # better name than "dict" > > ... blah blah blah > > else: > > ... > > > > > > > for word, count in dict.iteritems(): > > > print word + ":" + str(count) > > > > And this bit is okay too. > > > > > > Good luck! > > > > > > -- > > Steven
Thanks Steven appreciate great info for future coding. i have change names to be more decriptive and corrected the indentation... all works! cheers -- http://mail.python.org/mailman/listinfo/python-list