Printing with interspersed element

P

Paulo J. Matos

Hi all,

I guess this is a recurring issue for someone who doesn't really know
the python lib inside out. There must be a simple way to do this.
I have a list of objects [x1, x2, x3, ..., xn] and I have defined a
print method for them print_obj(). Now I want to print them
intersepersed by an element.
If I print [x1, x2, x3] interspersed by the element 10:
x1.print_obj() 10 x2.print_obj() 10 x3.print_obj()

Now, the question is, what's the best way to do this?

I guess I could do this recursively.
def print(el, lst):
if len(lst) == 0:
return
elif len(lst) == 1:
lst[0].print_obj()
else:
lst[0].print_obj()
print el,
print(el, lst[1:])

Now, some considerations. This seems cumbersome (it may have errors
has I have not tested and was written directly to the mail, but the
idea is clear). From what I know lst[1:] creates a copy of lst without
the first element which is really not good memory-wise.
So, what would be the python way to do it?

Cheers,
 
A

Arnaud Delobelle

Hi all,

I guess this is a recurring issue for someone who doesn't really know
the python lib inside out. There must be a simple way to do this.
I have a list of objects [x1, x2, x3, ..., xn] and I have defined a
print method for them print_obj(). Now I want to print them
intersepersed by an element.
If I print [x1, x2, x3] interspersed by the element 10:
x1.print_obj() 10 x2.print_obj() 10 x3.print_obj()

Now, the question is, what's the best way to do this?

Defining a print_obj() method is probably a bad idea. What if you
want to print to a file for example? Instead you can define a
__str__() method for your objects and then use the join() method of
strings like this:

print ' 10 '.join(str(x) for x in lst)

HTH
 
P

Paulo J. Matos

Hi all,

I guess this is a recurring issue for someone who doesn't really know
the python lib inside out. There must be a simple way to do this.
I have a list of objects [x1, x2, x3, ..., xn] and I have defined a
print method for them print_obj(). Now I want to print them
intersepersed by an element.
If I print [x1, x2, x3] interspersed by the element 10:
x1.print_obj() 10 x2.print_obj() 10 x3.print_obj()

Now, the question is, what's the best way to do this?

Defining a print_obj() method is probably a bad idea. What if you
want to print to a file for example? Instead you can define a
__str__() method for your objects and then use the join() method of
strings like this:

print ' 10 '.join(str(x) for x in lst)

Thanks for the tip but that has an issue when dealing with potentially
millions of objects. You are creating a string in memory to then dump
to a file [or screen] while you could dump to the file [or screen] as
you go through the original string. Right?
 
A

Arnaud Delobelle

Hi all,

I guess this is a recurring issue for someone who doesn't really
know
the python lib inside out. There must be a simple way to do this.
I have a list of objects [x1, x2, x3, ..., xn] and I have defined a
print method for them print_obj(). Now I want to print them
intersepersed by an element.
If I print [x1, x2, x3] interspersed by the element 10:
x1.print_obj() 10 x2.print_obj() 10 x3.print_obj()

Now, the question is, what's the best way to do this?

Defining a print_obj() method is probably a bad idea. What if you
want to print to a file for example? Instead you can define a
__str__() method for your objects and then use the join() method of
strings like this:

print ' 10 '.join(str(x) for x in lst)

Thanks for the tip but that has an issue when dealing with potentially
millions of objects. You are creating a string in memory to then dump
to a file [or screen] while you could dump to the file [or screen] as
you go through the original string. Right?

Why would you want to print millions of objects on the screen?

As for writing to a file, a million objects will probably mean a few
tens of million bytes which is not that much. Your proposed method
would not work as the python call stack would explode first. Here is
one that may meet your approval (it still requires a __str__ method on
your objects but you can adapt it easily):

def print_with_sep(sep, iterable, file=sys.stdout):
iterator = iter(iterable)
try:
file.write(str(iterator.next()))
for item in iterator:
file.write(sep)
file.write(str(item))
except StopIteration:
pass

# Use like this:
>>> print_with_sep(' 10 ', [obj1, obj2, obj3])
 
M

Matimus

Hi all,
I guess this is a recurring issue for someone who doesn't really know
the python lib inside out. There must be a simple way to do this.
I have a list of objects [x1, x2, x3, ..., xn] and I have defined a
print method for them print_obj(). Now I want to print them
intersepersed by an element.
If I print [x1, x2, x3] interspersed by the element 10:
x1.print_obj() 10 x2.print_obj() 10 x3.print_obj()
Now, the question is, what's the best way to do this?
Defining a print_obj() method is probably a bad idea.  What if you
want to print to a file for example?  Instead you can define a
__str__() method for your objects and then use the join() method of
strings like this:
print ' 10 '.join(str(x) for x in lst)

Thanks for the tip but that has an issue when dealing with potentially
millions of objects. You are creating a string in memory to then dump
to a file [or screen] while you could dump to the file [or screen] as
you go through the original string. Right?

Then I hope you are using stackless, because you are going to stack
overflow _way_ before you recurse 1 million times.

def print_list(seq, sep=','):
seq = iter(seq)
print seq.next(),
for item in seq:
print sep,
print item,
print

Matt
 
M

Marc 'BlackJack' Rintsch

If you want to do it "on the fly", then try something like this:

iter = [1,2,3,4,5].__iter__()
sys.stdout.write(str(iter.next()))
for n in iter:
sys.stdout.write(',' +str(n))

Maybe without shadowing the built in `iter()` and without calling the
"magic method" directly:

iterator = iter([1, 2, 3, 4, 5])

Ciao,
Marc 'BlackJack' Rintsch
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,901
Latest member
Noble71S45

Latest Threads

Top