[Tutor] Dynamically assign variable names to tuple objects
steve at pearwood.info
Tue Mar 1 22:37:50 CET 2011
Emile van Sebille wrote:
> On 3/1/2011 11:49 AM Sean Carolan said...
>>> My advice would be to go read up on the zip() function and the
>>> str.join() function. Then, if you are using python 2.x, go find
>>> itertools.izip. It does the same thing as zip but it's more memory
>>> efficient. With those two you can do it in about two lines or so (and
>>> maybe a few for set up and clarity and such).
>> This is what I've got so far:
>> import sys
>> myfiles = sys.argv[1:]
>> for i in zip(open(myfiles), open(myfiles), open(myfiles)):
>> print " ".join(i)
>> How would you:
>> 1. zip an arbitrary number of files in this manner? I hard-coded it
>> to do only three.
> One way:
> for i in zip([ open(filename) for filename in myfiles ])
Almost, you need to expand the list:
zip( *[open(filename) for filename in myfiles] )
which is equivalent to pseudocode:
zip(open(myfiles), open(myfiles), ..., open(myfiles[N]))
Another way is:
Again, you need to expand the list using *.
>> 2. Strip out trailing spaces and line breaks from the lines in each
> Convert the file contents before zip'ing -- so add
> def cleanedup(filename):
> return [ line.strip() for line in open(filename) ]
Better to do the stripping on demand, rather than all up front.
Especially if the files are huge. Turn the list comprehension [...] into
a generator expression (...):
return (line.strip() for line in open(filename))
> Then your loop looks like:
> for i in zip([ cleanedup(filename) for filename in myfiles ])
More information about the Tutor