pyt...@bdurham.com wrote:
Original poster here.

Thank you all for your ideas. I certainly learned some great techniques
by studying everyone's solutions!!

Thanks for the positive feedback -- it's something most folks like to hear when they try to assist and such thanks appears too rarely on the list.

Here's the solution I came up with myself. Its not as sexy as some of
the posted solutions, but it does have the advantage of not failing when
the number of input chars <> the number of placeholders in the pic
string.
>
Any feedback on what follows would be appreciated.
[snip]
# test cases
print picture("123456789", "(@@@)-@@-(@@@)[...@]")
print picture("123456789ABC", "(@@@)-@@-(@@@)[...@]")
print picture("1234", "(@@@)-@@-(@@@)[...@]")
print picture("123456789", "(@@@)-@@-(@@@)")
print picture("123456789", "(@@@)-@@-(@@@)[...@][@@@@@]")
        

You don't give the expected output for these test cases, so it's hard to tell whether you want to pad-left or pad-right.

Riffing on MRAB's lovely solution, you can do something like

  def picture(
      s, pic,
      placeholder='@',
      padding=' ',
      pad_left=True
      ):
    assert placeholder != '%'
    s = str(s)
    expected = pic.count(placeholder)
    if len(s) > expected:
      s = s[:expected]
    if len(s) < expected:
      if pad_left:
        s = s.rjust(expected, padding)
      else:
        s = s.ljust(expected, padding)
    return pic.replace(
      '%', '%%').replace(
      placeholder, '%s') % tuple(s)

print picture("123456789", "(@@@)-@@-(@@@)[...@]", pad_left=False)
print picture("123456789ABC", "(@@@)-@@-(@@@)[...@]", pad_left=False)
print picture("1234", "(@@@)-@@-(@@@)[...@]", pad_left=False)
print picture("123456789", "(@@@)-@@-(@@@)", pad_left=False)
print picture("123456789", "(@@@)-@@-(@@@)[...@][@@@@@]", pad_left=False)

That way you can specify your placeholder, your padding character, and whether you want it to pad to the left or right.

-tkc



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

Reply via email to