Strange behavior with iterables - is this a bug?

Terry Reedy tjreedy at udel.edu
Tue May 30 17:28:04 EDT 2006


<akameswaran at gmail.com> wrote in message 
news:1149019886.693900.126850 at u72g2000cwu.googlegroups.com...
> Ok, I am confused about this one.  I'm not sure if it's a bug or a
> feature.. but
>
>>>> ================================ RESTART
>>>> f1 = open('word1.txt')
>>>> f2 = open('word2.txt')
>>>> f3 = open('word3.txt')
>>>> print [(i1.strip(),i2.strip(),i3.strip(),) for i1 in f1 for i2 in f2 
>>>> for i3 in f3]
> [('a', 'a', 'a'), ('a', 'a', 'b'), ('a', 'a', 'c')]

A file is something like an iterator and something like an iterable.  At 
this point, the internal cursur for f3 points at EOF.  To reiterate thru 
the file, you must rewind in the inner loops.  So try (untest by me)

def initf(fil):
   f.seek(0)
   return f

and ...for i2 in initf(f2) for i3 in initf(f3)


>>>> l1 = ['a\n','b\n','c\n']
>>>> l2 = ['a\n','b\n','c\n']
>>>>
>>>> l3 = ['a\n','b\n','c\n']
>>>> print [(i1.strip(),i2.strip(),i3.strip(),) for i1 in l1 for i2 in l2 
>>>> for i3 in l3]
> [('a', 'a', 'a'), ('a', 'a', 'b'), ('a', 'a', 'c'), ('a', 'b', 'a'),
> ('a', 'b', 'b'), ('a', 'b', 'c'), ('a', 'c', 'a'), ('a', 'c', 'b'),
> ('a', 'c', 'c'), ('b', 'a', 'a'), ('b', 'a', 'b'), ('b', 'a', 'c'),
> ('b', 'b', 'a'), ('b', 'b', 'b'), ('b', 'b', 'c'), ('b', 'c', 'a'),
> ('b', 'c', 'b'), ('b', 'c', 'c'), ('c', 'a', 'a'), ('c', 'a', 'b'),
> ('c', 'a', 'c'), ('c', 'b', 'a'), ('c', 'b', 'b'), ('c', 'b', 'c'),
> ('c', 'c', 'a'), ('c', 'c', 'b'), ('c', 'c', 'c')]
>
> explanation of code:  the files word1.txt, word2.txt and word3.txt are
> all identical conataining the letters a,b and c one letter per line.
> The lists I've added the "\n" so that the lists are identical to what
> is returned by the file objects.  Just eliminating any possible
> differences.

But lists are not file objects and you did not eliminate the crucial 
difference in reiterability.  Try your experiment with StringIO objects, 
which are more nearly identical to file objects.

Terry Jan Reedy






More information about the Python-list mailing list