FLexible formatted text involving nested lists?

RossRGK nobody at nospam.noway
Thu Oct 9 22:36:35 CEST 2008


I'm having trouble getting my head around a solution for a situation 
where I need to flexibly format some text with a varying number of 
embedded fields.

Here's a simplified description of my challenge...

I have a list of lists called bigList:

bigList = [ little, small, tiny]

The sub-lists have varying sizes.  I won't know how many items they have 
but it will be between 0 and 3

So perhaps little = [3, 2, 7]
small = [6,4]
tiny = [2]

The values in those sub lists correspond to formatted print strings. The 
formatting strings will change over time and they are in a list called 
"fmts" where

fmts = [fmtA, fmtB, fmtC]   where

fmtA = 'oats %0d kilos over %0d days with %0d workers'
fmtB = 'barley %0d lbs for %0d hours'
fmtC = 'apples %0d baskets'

If I knew how many fields were in each 'sub-list' in bigList ahead of 
time, and it never changed I could awkwardly do this:

print fmtA %(little[0], little[1], little[2])
print fmtB %(small[0], small[1])
print fmtC %(tiny[0])

or equivalently,

print fmts[0] %(bigList[0][0], bigList[0][1], bigList[0][2])
print fmts[1] %(bigList[1][0], bigList[1][1])
print fmts[2] %(bigList[2][0])

Both approaches would yield:
oats 3 kilos over 2 days with 7 workers
barley 6 lbs for 4 hours
apples 2 baskets


Now my challenge: since the number of fields is unknown at design time, 
my app needs to add be able to flexibly handle this.

I though maybe I could use a loop that figures things out as it goes 
along. e.g...

i=0
for fmtString in fmts
   numbOfFields = len(fmt[i])
   print fmtString %(bigList[i][ need "for 0 to numbOffields" worth of 
indices!] )

But I don't know how to have a number of items in the print expression 
that align to the numbOfFields value!?  Is there some other approach I 
can use?

I thought perhaps it would accomodate extra elements in the %(...) part 
of the formatted print expression which would be ignored, but that 
doesn't work.

Maybe I have to break my fmts up and do a field at a time?  Any thoughts 
are appreciated   :)

-Ross.



More information about the Python-list mailing list