Printing with interspersed element

Discussion in 'Python' started by Paulo J. Matos, Oct 30, 2008.

  1. 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
     
    Paulo J. Matos, Oct 30, 2008
    #1
    1. Advertising

  2. On Oct 30, 8:07 pm, "Paulo J. Matos" <> wrote:
    > 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
     
    Arnaud Delobelle, Oct 30, 2008
    #2
    1. Advertising

  3. On Thu, Oct 30, 2008 at 8:42 PM, Arnaud Delobelle
    <> wrote:
    > On Oct 30, 8:07 pm, "Paulo J. Matos" <> wrote:
    >> 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
     
    Paulo J. Matos, Oct 30, 2008
    #3
  4. On 30 Oct 2008, at 21:10, Paulo J. Matos wrote:

    > On Thu, Oct 30, 2008 at 8:42 PM, Arnaud Delobelle
    > <> wrote:
    >> On Oct 30, 8:07 pm, "Paulo J. Matos" <> wrote:
    >>> 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
     
    Arnaud Delobelle, Oct 30, 2008
    #4
  5. Paulo J. Matos

    Matimus Guest

    On Oct 30, 2:10 pm, "Paulo J. Matos" <> wrote:
    > On Thu, Oct 30, 2008 at 8:42 PM, Arnaud Delobelle
    >
    >
    >
    > <> wrote:
    > > On Oct 30, 8:07 pm, "Paulo J. Matos" <> wrote:
    > >> 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
     
    Matimus, Oct 31, 2008
    #5
  6. 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
     
    Marc 'BlackJack' Rintsch, Oct 31, 2008
    #6
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Jon B
    Replies:
    7
    Views:
    7,614
    =?Utf-8?B?SmFzb25DaG9p?=
    Jan 30, 2006
  2. JustSomeGuy
    Replies:
    13
    Views:
    529
    msalters
    Dec 9, 2004
  3. Dan Stromberg
    Replies:
    2
    Views:
    322
    Fredrik Lundh
    Oct 3, 2004
  4. HANM
    Replies:
    2
    Views:
    764
    Joseph Kesselman
    Jan 29, 2008
  5. iffy agbim
    Replies:
    1
    Views:
    132
    Mark Andrews
    May 24, 2004
Loading...

Share This Page