I’m new to programming a bit, and am learning python so I can learn flask, using the python crash course book. I was learning about list comprehension but it briefly talks about it. If I do

list[list.append(value) for value in range(1, 20)]

it doesn’t work. Would this be some sort of recursive expression that is not possible?

  • bitfucker
    link
    fedilink
    arrow-up
    3
    arrow-down
    1
    ·
    5 months ago

    List comprehension is not whatever you’re doing there. An example of list comprehension:

    list = [value*2 for value in range(1, 20)]
    

    See, list comprehension is used to make a list from an existing list. The value of the new list is defined by a function. In this case, the value of a will be 2,4,6, etc.

    Your current syntax list[...], is trying to access an element of a list.

    • librejoe@lemmy.worldOP
      link
      fedilink
      arrow-up
      1
      ·
      5 months ago

      So you cannot use methods inside a list comprehension, only binary operators and the function range?

      • bitfucker
        link
        fedilink
        arrow-up
        2
        ·
        edit-2
        5 months ago

        You can. Whatever the method returns will be the element of that list. So if for example I do this:

        def mul(x):
          return x*2
        
        list = [mul(value) for value in range(1,20)]
        

        It will have the same effect. But this:

        def mul(x):
          return
        
        list = [mul(value) for value in range(1,20)]
        

        Will just makes the list element all None

        Edit to add more: List comprehension works not from the range function. Rather, the range function is returning a list. Hence the name, “list comprehension”. You can use any old list for it.

        What it did under the hood is that it iterates each element on the list that you specify (the in ...), and applies those to the function that you specify in the very first place. If you are familiar with the concept of Array.map in other languages, this is that. There is also a technical explanation for it if it helps, but it requires more time to explain. Just let me know if you would like to know it.

        • decivex@yiffit.net
          link
          fedilink
          arrow-up
          1
          ·
          edit-2
          5 months ago

          I know I’m being somewhat pedantic but range() returns an iterable range type, not a list, in python 3.

          • bitfucker
            link
            fedilink
            arrow-up
            1
            ·
            5 months ago

            Not at all. It is indeed helpful to differentiate between an iterable and literal list. After all, sometimes it will bite you in the ass when you don’t differentiate between the two.

        • librejoe@lemmy.worldOP
          link
          fedilink
          arrow-up
          1
          ·
          5 months ago

          Thanks for the response.

          I am aware somewhat of what an array is, as i’ve dabbled with them in C, and know they can be multi-dimensional. Sorry if I’m being blind, but all I see are function calls in that list comprehension. I think what im asking is stupid, as the range function is returning a list populated.

          • bitfucker
            link
            fedilink
            arrow-up
            2
            ·
            edit-2
            5 months ago

            No problems. Learning a new concept is not stupid. So you are familiar with C. In C term, you are likely to do something like this:

            int a[10] = {0}; // Just imagine this is 0,1,2,etc...
            int b[10] = {0};
            for (int i=0; i < 10; i++) {
              b[i] = a[i]*2;
            }
            

            A 1 to 1 correspondent might looks like ths:

            a = range(10) # 0,1,2,etc...
            b = []
            for x in a:
              b.append(x*2)
            

            However in python, you can then simplify to this:

            a = range(10) # Same as before, 0,1,2,etc...
            b = [x*2 for x in a]
            
            # This is also works
            b = [x*2 for x in [0,1,2,...]]
            

            Remember that list comprehension is used to make a new list, not just iteration. If you want to do something other than making a list from another list, it is better to use iteration. List comprehension is just “syntactic sugar” so to speak. The concept comes from functional programming paradigm.

            • librejoe@lemmy.worldOP
              link
              fedilink
              arrow-up
              1
              ·
              5 months ago

              Great explanation! I don’t know too much C, just a bit here and there, and my dad’s copy of K&R C he gave to me.

      • onlinepersona
        link
        fedilink
        English
        arrow-up
        2
        arrow-down
        2
        ·
        5 months ago

        Sure you can. As others have said, a list comprehension returns a new list. See the documentation.

        What are you trying to do though? Append a list comprehension to an existing list?

        See a modified version of @[email protected]’s code from their comment.

        def double(x):
          return 2 * x
        a = list(range(10))
        a.extend(double(value) for value in range(5))
        
        # a has 15 elements
        print(a)
        

        Anti Commercial-AI license