5 Replies - 353 Views - Last Post: 21 January 2014 - 01:24 PM Rate Topic: -----

#1 giny28  Icon User is offline

  • New D.I.C Head

Reputation: 1
  • View blog
  • 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 :dontgetit:/> :

>>> 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  Icon User is online

  • Pancakes!
  • member icon


Reputation: 7578
  • View blog
  • Posts: 12,742
  • 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.
Was This Post Helpful? 0
  • +
  • -

#3 giny28  Icon User is offline

  • New D.I.C Head

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

Re: function range() and loop 'for'

Posted 21 January 2014 - 12:59 PM

Thanks for your explanation :chinese:

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]]

Was This Post Helpful? 0
  • +
  • -

#4 jon.kiparsky  Icon User is online

  • Pancakes!
  • member icon


Reputation: 7578
  • View blog
  • Posts: 12,742
  • 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?
Was This Post Helpful? 0
  • +
  • -

#5 giny28  Icon User is offline

  • New D.I.C Head

Reputation: 1
  • View blog
  • 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' :dozingoff: 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]]

Was This Post Helpful? 1
  • +
  • -

#6 jon.kiparsky  Icon User is online

  • Pancakes!
  • member icon


Reputation: 7578
  • View blog
  • Posts: 12,742
  • 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.
Was This Post Helpful? 0
  • +
  • -

Page 1 of 1