It's really awkward the way you're using Counter here... you're making new
instances in every lambda (which is not great for memory usage), and then
not actually using the Counter functionality:

    return sum(1 for _ in filter(lambda x: Counter(word) == Counter(x.strip()),
fileContent))

(the whole point of the Counter() is to get sums, you don't need to do any
of this !!)

I'm not sure that they cared about how you used file.readlines(), I think
the memory comment was a hint about instantiating Counter()s


anyhow, all of this can be much much simpler:

"""
sortedword = sorted(inputWord)  # an array of letters in the word, in
alphabetical order
count = 0

with open(filename) as f:
    for word in f.read().split(' '):  # iterate over every word in the file
        if sorted(word) == sortedword:
            count +=1

print count
"""

which could in turn probably be written as a one liner.

So even though you cleaned the code up a bit, it's still quite a bit more
complicated then it needs to be, which makes it seem like your fundamentals
are not great either!





On Tue, Jun 6, 2017 at 2:31 AM, Peter Otten <__pete...@web.de> wrote:

> Schtvveer Schvrveve wrote:
>
> > I need someone's help. I am not proficient in Python and I wish to
> > understand something. I was in a job pre-screening process where I was
> > asked to solve a simple problem.
> >
> > The problem was supposed to be solved in Python and it was supposed to
> > take two arguments: filename and word. The program reads the file which
> is
> > a .txt file containing a bunch of words and counts how many of those
> words
> > in the file are anagrams of the argument.
> >
> > First I concocted this solution:
> >
> > import sys
> > from collections import Counter
> >
> > def main(args):
> >     filename = args[1]
> >     word = args[2]
> >     print countAnagrams(word, filename)
> >
> > def countAnagrams(word, filename):
> >
> >     fileContent = readFile(filename)
> >
> >     counter = Counter(word)
> >     num_of_anagrams = 0
> >
> >     for i in range(0, len(fileContent)):
> >         if counter == Counter(fileContent[i]):
> >             num_of_anagrams += 1
> >
> >     return num_of_anagrams
> >
> > def readFile(filename):
> >
> >     with open(filename) as f:
> >         content = f.readlines()
> >
> >     content = [x.strip() for x in content]
> >
> >     return content
> >
> > if __name__ == '__main__':
> >     main(sys.argv)
> >
> > Very quickly I received this comment:
> >
> > "Can you adjust your solution a bit so you less loops (as little as
> > possible) and also reduce the memory usage footprint of you program?"
> >
> > I tried to rework the methods into this:
> >
> > def countAnagrams(word, filename):
> >
> >     fileContent = readFile(filename)
> >
> >     return sum(1 for _ in filter(lambda x: Counter(word) ==
> > Counter(x.strip()), fileContent))
> >
> > def readFile(filename):
> >
> >     with open(filename) as f:
> >         content = f.readlines()
> >
> >     return content
> >
> > And I was rejected. I just wish to understand what I could have done for
> > this to be better?
> >
> > I am a Python beginner, so I'm sure there are things I don't know, but I
> > was a bit surprised at the abruptness of the rejection and I'm worried
> I'm
> > doing something profoundly wrong.
>
> for i in range(0, len(stuff)):
>     ...
>
> instead of
>
> for item in stuff:
>     ...
>
> and
>
> content = file.readlines() # read the whole file into memory
> process(content)
>
> are pretty much the most obvious indicators that you are a total newbie in
> Python. Looks like they weren't willing to give you the time to iron that
> out on the job even though you knew about lambda, Counter, list
> comprehensions and generator expressions which are not newbie stuff.
>
> When upon their hint you did not address the root cause of the unbounded
> memory consumption they might have come to the conclusion that you were
> reproducing snippets you picked up somewhere and thus were cheating.
>
> _______________________________________________
> Tutor maillist  -  Tutor@python.org
> To unsubscribe or change subscription options:
> https://mail.python.org/mailman/listinfo/tutor
>
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor

Reply via email to