Problem in understanding Python list comprehensions

前端 未结 6 985
情书的邮戳
情书的邮戳 2021-02-03 13:42

What does the last line mean in the following code?

import pickle, urllib                                                                                                 


        
相关标签:
6条回答
  • 2021-02-03 13:50

    Firstly, you need to put http:// in front of the URL, ie:

    handle = urllib.urlopen("http://www.pythonchallenge.com/pc/def/banner.p")
    

    An expression [e for e in a_list] is a list comprehension which generates a list of values.

    With Python strings, the * operator is used to repeat a string. Try typing in the commands one by one into an interpreter then look at data:

    >>> data[0]
    [(' ', 95)]
    

    This shows us each line of data is a tuple containing two elements.

    Thus the expression e[1] * e[0] is effectively the string in e[0] repeated e[1] times.

    Hence the program draws a banner.

    0 讨论(0)
  • 2021-02-03 13:52

    The question itself has already been fully answered but I'd like to add that a list comprehension also supports filtering. Your original line

    print "".join([e[1] * e[0] for e in elt])
    

    could, as an example, become

    print "".join([e[1] * e[0] for e in elt if len(e) == 2])
    

    to only operate on items in elt that have two elements.

    0 讨论(0)
  • 2021-02-03 13:52

    Andy's is a great answer!

    If you want to see every step of the loop (with line-breaks) try this out:

    for elt in data:
        for e in elt:
            print "e[0] == %s, e[1] == %d, which gives us:  '%s'" % (e[0], e[1], ''.join(e[1] * e[0]))
    
    0 讨论(0)
  • 2021-02-03 14:00

    [e[1] * e[0] for e in elt] is a list comprehension, which evaluates to a list itself by looping through another list, in this case elt. Each element in the new list is e[1]*e[0], where e is the corresponding element in elt.

    0 讨论(0)
  • 2021-02-03 14:07

    join() is a string method, that works on a separator in new string

    >>> ':'.join(['ab', 'cd'])
    >>> 'ab:cd'
    

    and list comprehension is not necessary there, generator would suffice

    0 讨论(0)
  • 2021-02-03 14:09

    Maybe best explained with an example:

    print "".join([e[1] * e[0] for e in elt])
    

    is the short form of

    x = []
    for e in elt:
      x.append(e[1] * e[0])
    print "".join(x)
    

    List comprehensions are simply syntactic sugar for for loops, which make an expression out of a sequence of statements.

    elt can be an arbitrary object, since you load it from pickles, and e likewise. The usage suggests that is it a sequence type, but it could just be anything that implements the sequence protocol.

    0 讨论(0)
提交回复
热议问题