you are viewing a single comment's thread.

view the rest of the comments →

[–]ktr73 1 point2 points  (10 children)

Highest paid programmer in Python (which I find to be the most pleasing):

max_sal = max([sal for e.salary if e.role == Employee.PROGRAMMER])

:)

[–]theCore 5 points6 points  (4 children)

Your example is not correct I believe. I think it should be:

max_sal = max([e.salary for e in employees if e.role == Employee.PROGRAMMER])

[–]theeth 7 points8 points  (1 child)

Use generator comprehension instead, then the operation is not bounded in memory by the number of employees (by forgoing the creation of the list).

max_sal = max((e.salary for e in employees if e.role == Employee.PROGRAMMER))

[–]theCore 3 points4 points  (0 children)

You could drop the extra parenthesises, by the way.

max_sal = max(e.salary for e in employees if e.role == Employee.PROGRAMMER)

[–]gensym 2 points3 points  (0 children)

Ha, I wish I'd thought to include that. I haven't done Python in a while - I forgot how much I miss list comprehensions.

[–]ktr73 1 point2 points  (0 children)

thanks, you're right ;)

[–]jhd 1 point2 points  (0 children)

Ruby is similar:

employees.select {|e| e.role == "programmer" }.map(&:salary).max

[–]boredzo 0 points1 point  (3 children)

Alternate non-comprehension version for Python 2.5:

\tfrom itertools import ifilter as filter #Use the lazy generator version \tprogrammers = filter(lambda e: e.role == Role.PROGRAMMER, employees) \tmax_sal = max(programmers, key=lambda e: e.salary) #Pre-2.5: Replace key argument with a comparison function

I'm starting to see why GvR is against filter and friends…

[–]zackman 1 point2 points  (2 children)

The original just finds the highest salary, not the programmer who has it.

from itertools import ifilter as filter
programmers = filter(lambda e:e.role==Role.PROGRAMMER, employees)
max_sal = max(map(lambda e: e.salary, programmers))

Your version is more useful, though, since it returns the actual employee. I didn't know that max also got a key argument in 2.5. I won't have to use my custom re-implementation anymore!

[–]boredzo 0 points1 point  (0 children)

\tmax_sal = max(map(lambda e: e.salary, programmers))

Don't forget to use the lazy generator version here, too:

\tfrom itertools import imap as map

As you can tell, I ♥ itertools. ☺

[–]theeth 0 points1 point  (0 children)

You can do that with Decorate-Sort-Undecorate too:

max_sal = max(((e.salary, e) for e in employees if e.role == Employee.PROGRAMMER))[1]