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