I will read this when I get a minute, but I must say thanks for the explanation.
 
tutor@python really is the most helpful mailing list EVER!
 
> Date: Tue, 24 Jun 2014 00:54:30 +1000
> From: st...@pearwood.info
> To: tutor@python.org
> Subject: Re: [Tutor] write dictionary to file
> 
> On Mon, Jun 23, 2014 at 09:17:44AM +0000, Ian D wrote:
> 
> > > for row in spamreader:
> > >     if row['year'] == '40':
> > >         email = row['user'] + '@email.com'
> > >         output = [ row[fieldname] for fieldname in fields ]
> > 
> > I am unsure about this syntax [ row[fieldname] for fieldname in fields ]
> 
> 
> That's called a "list comprehension". It is a way of building up a list 
> as a single expression. Let's start with the old-fashioned way to build 
> a list:
> 
> output = []
> for fieldname in fields:
>     output.append( row[fieldname] )
> 
> 
> Or, we can do exactly the same thing, in a single line, with a list 
> comprehension, and get rid of the temporary variables:
> 
> output = [row[fieldname] for fieldname in fields]
> 
> If you remember your high school maths classes, the form of the list 
> comp is rather close to that of mathematical set builder notation:
> 
> http://www.mathsisfun.com/sets/set-builder-notation.html
> 
> Here is a set builder notation, and its English translation:
> 
> {2n+1 : n ∈ {1,2,3,4}}
> 
> This reads as "the set of 2n plus 1, such that n is an element of 
> {1,2,3,4}". Don't be confused by the fact that there is a set inside a 
> set -- this just tells us how to build a new set from an old set.
> 
> So we start with a set {1,2,3,4}, and let n equal each of those numbers 
> in turn. Then we calculate 2n+1, and use that inside the new set we're 
> creating:
> 
> n = 1, so 2n+1 => 3
> n = 2, so 2n+1 => 5
> n = 3, so 2n+1 => 7
> n = 4, so 2n+1 => 9
> 
> and so the final result is the set {3, 5, 7, 9}.
> 
> Enough about sets and mathematics! Now we're going to talk about Python! 
> Python uses the same sort of expression, except it builds a list, not a 
> set, and calls it a "list comprehension" instead of a "list builder". 
> (Don't blame me for that, blame the Haskell programming language which 
> invented this.)
> 
> So, we start with the mathematical set builder:
> 
>     {2n+1 : n ∈ {1,2,3,4}}
> 
> 
> Turn the sets into lists:
> 
>     [2n+1 : n ∈ [1,2,3,4]]
> 
> 
> Use Python syntax for the formula:
> 
>     [2*n+1 : n ∈ [1,2,3,4]]
> 
> 
> Replace the "such that" and "element of" with "for" "in":
> 
>     [2*n+1 for n in [1,2,3,4]]
>     
> 
> and now you have a Python list comprehension. If you copy and paste that 
> into a Python interpreter, you'll see this:
> 
> py> [2*n+1 for n in [1,2,3,4]]
> [3, 5, 7, 9]
> 
> 
> 
> > > # DictWriter needs a dict, not a list.
> > > spamwriter.writerow({name: row[name] for name in fields})
> > 
> > And this writerow syntax is something new for me, as are dictionaries
> > (which I have tried to read up and understand.)
> 
> List comprehensions were added to Python in, I think, version 2.2, which 
> was about ten years ago. They turned out to be so useful and popular 
> that now, in Python 3, we have FOUR different kinds of "comprehensions" 
> or builder syntax:
> 
> List comprehensions:
>     [2*n+1 for n in [1,2,3,4]]
> 
> Generator expressions (like a list comp, except values are created 
> lazily on demand, rather than all at once):
>     (x+1 for x in [2, 4, 6, 8])
> 
> Set comprehensions (like a list comp, except it builds a set rather than 
> a list):
>     {char.lower() for char in "Hello World!"}
> 
> Dict comprehensions (like a list comp, except it builds a dictionary of 
> key:value pairs):
>     {char: char.lower() for char in "Hello World!"}
> 
> 
> So what is a dict? A dict, short for dictionary, is a table of keys with 
> associated values. Think of them as being like words and definitions:
> 
>     words = { 
>       "cat": "a small mammal that purrs",
>       "dog": "man's best friend",
>       "snake": "a lizard with no legs",
>       "ostrich": "biggest bird in the world"
>       }
> 
> 
> The first part, before the colon, is the key. The part after the colon 
> is the value associated with that key. If you want to know the meaning 
> of a word, you look it up in the dictionary:
> 
> py> print(words['dog'])
> man's best friend
> 
> 
> To add a new word:
> 
> py> words['kangeroo'] = 'jumping marsupial from Australia'
> py> print(words['kangeroo'])
> jumping marsupial from Australia
> 
> 
> So I've already shown you the dict comprehension form:
> 
> spamwriter.writerow({name: row[name] for name in fields})
> 
> 
> Here is how we can do it the old-fashioned way without a dict comp:
> 
> 
> table = {}
> for name in fields:
>     value = row[name]
>     table[name] = value
> 
> spamwriter.writerow(table)
> 
> 
> 
> 
> Does this help? Ask any further questions you may have.
> 
> 
> 
> 
> 
> -- 
> Steven
> _______________________________________________
> 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