By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
454,525 Members | 1,667 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 454,525 IT Pros & Developers. It's quick & easy.

Printing with interspersed element

P: n/a
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,

--
Paulo Jorge Matos - pocmatos at gmail.com
Webpage: http://www.personal.soton.ac.uk/pocm
Oct 30 '08 #1
Share this Question
Share on Google+
8 Replies


P: n/a
On 2008-10-30, Paulo J. Matos <po**@ecs.soton.ac.ukwrote:
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()
>>','.join([str(i) for i in [1,2,3,4]])
'1,2,3,4'
>>','.join([i.__repr__() for i in [1,2,3,4]])
'1,2,3,4'
>>','.join([str(i) for i in [1]])
'1'

--
Grant Edwards grante Yow! What I want to find
at out is -- do parrots know
visi.com much about Astro-Turf?
Oct 30 '08 #2

P: n/a
On Oct 30, 8:07*pm, "Paulo J. Matos" <p...@ecs.soton.ac.ukwrote:
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

--
Arnaud

Oct 30 '08 #3

P: n/a
On Thu, Oct 30, 2008 at 8:42 PM, Arnaud Delobelle
<ar*****@googlemail.comwrote:
On Oct 30, 8:07 pm, "Paulo J. Matos" <p...@ecs.soton.ac.ukwrote:
>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?
HTH

--
Arnaud

--
http://mail.python.org/mailman/listinfo/python-list


--
Paulo Jorge Matos - pocmatos at gmail.com
Webpage: http://www.personal.soton.ac.uk/pocm
Oct 30 '08 #4

P: n/a

On 30 Oct 2008, at 21:10, Paulo J. Matos wrote:
On Thu, Oct 30, 2008 at 8:42 PM, Arnaud Delobelle
<ar*****@googlemail.comwrote:
>On Oct 30, 8:07 pm, "Paulo J. Matos" <p...@ecs.soton.ac.ukwrote:
>>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])
--
Arnaud

Oct 30 '08 #5

P: n/a
On 2008-10-30, Paulo J. Matos <po******@gmail.comwrote:
On Thu, Oct 30, 2008 at 8:42 PM, Arnaud Delobelle
<ar*****@googlemail.comwrote:
>On Oct 30, 8:07 pm, "Paulo J. Matos" <p...@ecs.soton.ac.ukwrote:
>>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?
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))

--
Grant Edwards grante Yow! The SAME WAVE keeps
at coming in and COLLAPSING
visi.com like a rayon MUU-MUU ...
Oct 30 '08 #6

P: n/a
On Oct 30, 2:10*pm, "Paulo J. Matos" <pocma...@gmail.comwrote:
On Thu, Oct 30, 2008 at 8:42 PM, Arnaud Delobelle

<arno...@googlemail.comwrote:
On Oct 30, 8:07 pm, "Paulo J. Matos" <p...@ecs.soton.ac.ukwrote:
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
Oct 31 '08 #7

P: n/a
On Thu, 30 Oct 2008 16:40:17 -0500, Grant Edwards wrote:
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
Oct 31 '08 #8

P: n/a
At 2008-10-30T21:10:09Z, "Paulo J. Matos" <po******@gmail.comwrites:
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?
How about:

def alternator(lst, sep):
for index, item in enumerate(lst):
if index:
yield sep
yield item

for item in alternator(list_of_objects, 10):
print item,

--
Kirk Strauser
The Day Companies
Nov 6 '08 #9

This discussion thread is closed

Replies have been disabled for this discussion.