function range() and loop 'for'

Page 1 of 1

5 Replies - 628 Views - Last Post: 21 January 2014 - 01:24 PMRate Topic: //<![CDATA[ rating = new ipb.rating( 'topic_rate_', { url: 'http://www.dreamincode.net/forums/index.php?app=forums&module=ajax&section=topics&do=rateTopic&t=338647&amp;s=97321145581662bb7735ff251118f7f7&md5check=' + ipb.vars['secure_hash'], cur_rating: 0, rated: 0, allow_rate: 0, multi_rate: 1, show_rate_text: true } ); //]]>

#1 giny28

• New D.I.C Head

Reputation: 1
• Posts: 21
• Joined: 07-January 14

function range() and loop 'for'

Posted 21 January 2014 - 12:21 PM

Hello,

I didn't understand the functional approach with the loop'for'. Could you explain me that?

U = >>> [[x * y for x in range (3)] for y in range (3)]
U >>>
[[0, 0, 0], [0, 1, 2], [0, 2, 4]]

I tried to understand with print but it does not tell me much /> :

>>> print([i*j for j in range(3)])
[0, 2, 4]
>>> print([i*j for i in range(3)])
[0, 2, 4]

Is This A Good Question/Topic? 0

Replies To: function range() and loop 'for'

#2 jon.kiparsky

• Pancakes!

Reputation: 8473
• Posts: 14,661
• Joined: 19-March 11

Re: function range() and loop 'for'

Posted 21 January 2014 - 12:34 PM

I'm not sure exactly what you're after here, but I can unpack this line a little.

What you have here is called a list comprehension - that's a good phrase to search up and read up on.
In fact, it's a nested list comprehension, so let's take the inner one to start with:

```[x * y for x in range (3)]
```

This evaluates to a list whose elements are x*y for some xs and ys. What are the xs? They are the elements of the range(3), which is to say, the list [0,1,2]. That is, they are a sequence of three elements, and x takes each of those values in turn. So what is x? x is not specified in the comprehension, so we have to get it from outside.
Let's look at the outer loop:

[?????? for y in range (3)]

This generates a list of ?????? for each value in the range (3), and for each of those somethings in the list, y is available as a value from that range. What is that mysterious thing? Well, it's just that inner comprehension - so now we know where y comes from.

```[[x * y for x in range (3)] for y in range (3)]
```

So we can read this as "make me a list with one element for each value y in range(3), and make each of those elements a list, itself containing one element x*y for each value x in the range (3)"

You can read this as a special sort of for loop if you like:

list1 = []
for y in range (3):
list2 = []
for x in range(3):
list2.append(x*y)
list1.append(list2)

In general, a list comprehension can be rewritten as a for loop in this fashion, but it doesn't work the other way: you can't rewrite all for loops as list comprehensions.

#3 giny28

• New D.I.C Head

Reputation: 1
• Posts: 21
• Joined: 07-January 14

Re: function range() and loop 'for'

Posted 21 January 2014 - 12:59 PM

Thanks for your explanation

if i have to create the matrix Z = [[1,2,3],[4,5,6]] (2 lines and 3 columns), and to use that special loop but my codes don't work good :

```>> squares = []
>>> for x in range(6):
squares.append(x+1)
Z = [squares]

>>> Z
[[1, 2, 3, 4, 5, 6]]
>>> squares
[1, 2, 3, 4, 5, 6]
```

```>>> [[x+1 for x in range(6)]]
[[1, 2, 3, 4, 5, 6]]

>>> [[x+1 for x in range(6)]]
[[1, 2, 3, 4, 5, 6]]
>>> [[x+y for x in range(1,4)] for y in range(0,2)]
[[1, 2, 3], [2, 3, 4]]
```

#4 jon.kiparsky

• Pancakes!

Reputation: 8473
• Posts: 14,661
• Joined: 19-March 11

Re: function range() and loop 'for'

Posted 21 January 2014 - 01:03 PM

That's a nice little puzzle. I'm going to let you work it out. Here's a hint: [1,2,3] and [4,5,6] are the same sort of progression. What sort of operator do you need here?

#5 giny28

• New D.I.C Head

Reputation: 1
• Posts: 21
• Joined: 07-January 14

Re: function range() and loop 'for'

Posted 21 January 2014 - 01:18 PM

i think that's the operator 'addition' to get this matrix Z = [[1,2,3],[4,5,6]]
```>>> [x+1 for x in [1,2,3]]
[2, 3, 4]
>>> [x for x in [1,2,3]]
[1, 2, 3]
>>> [[x for x in [1,2,3]] for y in [4,5,6]]
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
>>> [x for x in [4,5,6]]
[4, 5, 6]
>>> [[x+y for x in [1,2,3]] for y in [4,5,6]]
[[5, 6, 7], [6, 7, 8], [7, 8, 9]]
>>> [[x+y for x in [1,2,3]] for y in range(2)]
[[1, 2, 3], [2, 3, 4]]
```

#6 jon.kiparsky

• Pancakes!

Reputation: 8473
• Posts: 14,661
• Joined: 19-March 11

Re: function range() and loop 'for'

Posted 21 January 2014 - 01:24 PM

That's correct. You're almost there now - you just need to figure out how to express "the thing to add to each member of that range" (what you might call the "offset". You can do that in a few ways. For example, you can do it with an explicit list of two values, or you can do it arithmetically, or you could use a range() with the step parameter.