Creating formatted output using picture strings
Tim Chase
python.list at tim.thechases.com
Wed Feb 10 13:04:14 EST 2010
python at 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
More information about the Python-list
mailing list