Velocity Reviews > For Loop in List

# For Loop in List

subhabangalore@gmail.com
Guest
Posts: n/a

 01-13-2013
Dear Group,

I have a list like,

>>> list1=[1,2,3,4,5,6,7,8,9,10,11,12]

Now, if I want to take a slice of it, I can.
It may be done in,
>>> list2=list1[:3]
>>> print list2

[1, 2, 3]

If I want to iterate the list, I may do as,

>>> for i in list1:

print "Iterated Value Is:",i

Iterated Value Is: 1
Iterated Value Is: 2
Iterated Value Is: 3
Iterated Value Is: 4
Iterated Value Is: 5
Iterated Value Is: 6
Iterated Value Is: 7
Iterated Value Is: 8
Iterated Value Is: 9
Iterated Value Is: 10
Iterated Value Is: 11
Iterated Value Is: 12

Now, I want to combine iterator with a slicing condition like

>>> for i=list2 in list1:

print "Iterated Value Is:",i

So, that I get the list in the slices like,
[1,2,3]
[4,5,6]
[7,8,9]
[10,11,12]

But if I do this I get a Syntax Error, is there a solution?

If anyone of the learned members may kindly let me know?

Apology for any indentation error,etc.

Regards,
Subhabrata

Dave Angel
Guest
Posts: n/a

 01-13-2013
On 01/13/2013 07:45 AM, http://www.velocityreviews.com/forums/(E-Mail Removed) wrote:
> Dear Group,
>
> I have a list like,
>
>>>> list1=[1,2,3,4,5,6,7,8,9,10,11,12]

What version of Python?

> Now, if I want to take a slice of it, I can.
> It may be done in,
>>>> list2=list1[:3]
>>>> print list2

> [1, 2, 3]
>
> If I want to iterate the list, I may do as,
>
>>>> for i in list1:

> print "Iterated Value Is:",i
>
>
> Iterated Value Is: 1
> Iterated Value Is: 2
> Iterated Value Is: 3
> Iterated Value Is: 4
> Iterated Value Is: 5
> Iterated Value Is: 6
> Iterated Value Is: 7
> Iterated Value Is: 8
> Iterated Value Is: 9
> Iterated Value Is: 10
> Iterated Value Is: 11
> Iterated Value Is: 12
>
> Now, I want to combine iterator with a slicing condition like
>
>>>> for i=list2 in list1:

> print "Iterated Value Is:",i
>
> So, that I get the list in the slices like,
> [1,2,3]
> [4,5,6]
> [7,8,9]
> [10,11,12]
>
> But if I do this I get a Syntax Error, is there a solution?

It'd be only polite if you actually included the traceback, instead of
paraphrasing the error.

> If anyone of the learned members may kindly let me know?
>
> Apology for any indentation error,etc.
>
>
> Regards,
> Subhabrata
>
>
>
>

let's examine the code that generates the syntax error.
for i=list2 in list1:

That doesn't match any of the grammar of Python, so it gives a syntax
error. How could the compiler have interpreted it? Perhaps it could
have thrown out the 'for' and the colon. That would be equivalent in
this case to:
i = False

or we could toss out the "=list2" but that would give us your first loop.

If I were doing this, I'd do something like (untested):

temp = list1[:] #make a shallow copy of the list, so we're not
modifying the original
while temp
print temp[:3]
temp = temp[3:]

I think you could do something similar with zip, but I don't have the
energy this morning.

--

DaveA

Tim Chase
Guest
Posts: n/a

 01-13-2013
On 01/13/13 06:45, (E-Mail Removed) wrote:
> Dear Group,
>
> I have a list like,
>
>>>> list1=[1,2,3,4,5,6,7,8,9,10,11,12]

>
> Now, if I want to take a slice of it, I can.
> It may be done in,
>>>> list2=list1[:3]
>>>> print list2

[snip]
> Now, I want to combine iterator with a slicing condition like
>
>>>> for i=list2 in list1:

> print "Iterated Value Is:",i
>
> So, that I get the list in the slices like,
> [1,2,3]
> [4,5,6]
> [7,8,9]
> [10,11,12]

Well, you get a SyntaxError because, well, it's a syntax error. It
may take a little math to do this:

>>> SIZE = 3
>>> for i in range(len(list1)//SICE):

.... print list1[i*SIZE:i*SIZE+SIZE]
....
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
[10, 11, 12]

Or, you can exploit the fact that iterators exhaust inside a for-loop:

>>> i = iter(list1)
>>> for item in i:

.... print [item, i.next(), i.next()]
....
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
[10, 11, 12]

Hope this helps,

-tkc

Boris FELD
Guest
Posts: n/a

 01-13-2013
2013/1/13 Tim Chase <(E-Mail Removed)>:
> On 01/13/13 06:45, (E-Mail Removed) wrote:
>
>>>> SIZE = 3
>>>> for i in range(len(list1)//SICE):

> ... print list1[i*SIZE:i*SIZE+SIZE]
> ...
> [1, 2, 3]
> [4, 5, 6]
> [7, 8, 9]
> [10, 11, 12]
>

A little shorter and simpler version:
>>> x = x[1:]
>>> for i in range(0,len(x),SIZE):

.... print x[i: i+SIZE]
....
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
[10, 11, 12]

Hope it helps

> Hope this helps,
>
> -tkc

Tim Chase
Guest
Posts: n/a

 01-13-2013
On 01/13/13 07:48, Boris FELD wrote:
> 2013/1/13 Tim Chase <(E-Mail Removed)>:
>>>>> SIZE = 3
>>>>> for i in range(len(list1)//SICE):

>> ... print list1[i*SIZE:i*SIZE+SIZE]

>
> A little shorter and simpler version:
>>>> x = x[1:]
>>>> for i in range(0,len(x),SIZE):

> ... print x[i: i+SIZE]

Doh, I always forget that range() takes an optional stride. Or
rather, I use it so infrequently that I reach for other alternatives
before it occurs to me

-tkc

Mitya Sirenef
Guest
Posts: n/a

 01-13-2013
On 01/13/2013 07:45 AM, (E-Mail Removed) wrote:
> Dear Group,
>
> I have a list like,
>
>>>> list1=[1,2,3,4,5,6,7,8,9,10,11,12]

> Now, if I want to take a slice of it, I can.
> It may be done in,
>>>> list2=list1[:3]
>>>> print list2

> [1, 2, 3]
>
> If I want to iterate the list, I may do as,
>
>>>> for i in list1:

> print "Iterated Value Is:",i
>
>
> Iterated Value Is: 1
> Iterated Value Is: 2
> Iterated Value Is: 3
> Iterated Value Is: 4
> Iterated Value Is: 5
> Iterated Value Is: 6
> Iterated Value Is: 7
> Iterated Value Is: 8
> Iterated Value Is: 9
> Iterated Value Is: 10
> Iterated Value Is: 11
> Iterated Value Is: 12
>
> Now, I want to combine iterator with a slicing condition like
>
>>>> for i=list2 in list1:

> print "Iterated Value Is:",i
>
> So, that I get the list in the slices like,
> [1,2,3]
> [4,5,6]
> [7,8,9]
> [10,11,12]
>
> But if I do this I get a Syntax Error, is there a solution?
>
> If anyone of the learned members may kindly let me know?
>
> Apology for any indentation error,etc.
>
>
> Regards,
> Subhabrata
>
>
>
>

Another good answer is to use a recipe from itertools docs page.
There are a lot of good recipes there and you may want to keep
them all in a module you can import from when needed. Here
is the recipe:

def grouper(n, iterable, fillvalue=None):
"""From itertools recipes: collect data into fixed-length chunks or
blocks."""
# grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return zip_longest(fillvalue=fillvalue, *args)

>>> list(grouper(3, range(12))

....
....
....
.... )
[(0, 1, 2), (3, 4, 5), (6, 7, , (9, 10, 11)]

HTH, - mitya

--
Lark's Tongue Guide to Python: http://lightbird.net/larks/