Caleb Hattingh wrote:
filenames = [os.path.join(dirpath, filename)
              # This is cool
              for dirpath, _, filenames in os.walk('.')
              # This is getting tricky, whats the '_' for?

Nothing to do with the list comprehension really. '_' is a commonly used variable name for an object that we don't care about. If you look at the OP's original code, the line:


   [(x[0], x[2]) for x in os.walk(".")]

is the equivalent of:

   [dirpath, filenames for dirpath, dirnames, filenames in os.walk('.')]

I prefer to give names to the values produced by os.walk -- I think it makes the usage much clearer. However, since I don't use 'dirnames', I use '_' to indicate this:

   [dirpath, filenames for dirpath, _, filenames in os.walk('.')]

Would

    filenames = [os.path.join(dirpath, filename)
                 for dirpath, dirnames, filenames in os.walk('.')
                 for filename in filenames]

have been clearer for you? Then all you have to do is remember the order of the for-loop execution:

              # Which thing  goes where again in a comprehension?
              for filename in filenames]

As mentioned in my other post, the order is identical to that of for-loops, e.g.


    result = []
    for dirpath, _, filenames in os.walk('.'):
        for filename in filenames:
            result.append(os.path.join(dirpath, filename))

is basically equivalent to:

    [os.path.join(dirpath, filename)
     for dirpath, _, filenames in os.walk('.')
     for filename in filenames]

Does that help?

Steve
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to