Project Euler #22 - Names Scores I programmed Problem #22 from Project Euler in Python. It works but I want to know if it really is pythonic enough.


  Using names.txt (right click and 'Save Link/Target As...'), a 46K text
  file containing over five-thousand first names, begin by sorting it
  into alphabetical order. Then working out the alphabetical value for
  each name, multiply this value by its alphabetical position in the
  list to obtain a name score.
  
  For example, when the list is sorted into alphabetical order, COLIN,
  which is worth 3 + 15 + 12 + 9 + 14 = 53, is the 938th name in the
  list. So, COLIN would obtain a score of 938 × 53 = 49714.
  
  What is the total of all the name scores in the file?


from itertools import count 

FILE = "e022.txt"
CHAR_OFFSET = ord('A') - 1

def parse(file):
    """Return the read in list"""
    with open(file) as fid:
        return fid.read().replace('"',"").split(',')

def score_name(name):
    """Returns the score of a single name"""
    return sum(ord(char) - CHAR_OFFSET for char in list(name))

def score_names(names):
    """Returns the score of the list"""
    return sum(ind*score_name(name) for (ind, name) in zip(count(1),sorted(names)))

if __name__ == "__main__":
    print(score_names(parse(FILE)))


Please feel free to critic me on it. One thing I wasn't sure about: In the file parser, did I need to make the with guard or is this not needed when encapsulated in a function?

Furthermore, the global variable FILE is in a place where it is easy accessible, but let's say we would import it as a module and wouldn't need it. Should I move it down to the main guard and loose a bit of overview?
Your code is split into small functions and looks nice.

A few things could be done in a better way.

zip(count(1),sorted(names) can be rewritten with the enumerate builtin : enumerate(sorted(names), start=1).

You can iterate directly over strings so you don't need to use a list in list(name).

You don't need parenthesis in for (ind, name) in.

To answer your question :


FILE could easily be moved behind the main guard so I'd put it there. Had it been the smallest of the issues, I would have left it where it currently is.
for the with, I consider it to be a good habit to put it. Also, this should answer your solution.