[Tutor] Unintentionally manipulating a list
Steven D'Aprano
steve at pearwood.info
Fri Feb 25 16:35:20 CET 2011
ranjan das wrote:
> I am facing the following problem
>
>
> I have a list of the form
>
> INPUT= [ [ ['A1-N','A2-Y','A3-N' ],['B1-Y','B2-N','B3-N' ] ], [.........] ]
> and I want an output of the form (selecting only those elements which have a
> Y associated with them)
>
> OUTPUT=[ ['A2-Y', 'B1-Y'],[....] ]
Can the Y be anywhere, or must it be at the end of the string? Should
'Y2-N' be included or excluded? I will assume excluded.
What about lowercase 'y'? Should 'A3-y' be included? I assume it should be.
> I wrote the following code. Although it gives me the desired output, it
> CHANGES the list INPUT
Start with a simple function that extracts the strings you want from the
inner-most list, Here's the hard way:
def select(items, suffix):
suffix = suffix.upper()
result = []
for s in items:
if s.upper().endswith(suffix):
result.append(s)
return result
This can be simplified to:
def select(items, suffix):
suffix = suffix.upper()
return [s for s in items if s.upper().endswith(suffix)]
Now you can use it:
OUTPUT = []
# INPUT looks like:
# [ [a1_list, b1_list, ...], [a2_list, b2_list, ...], ... ]
for middle in INPUT:
# middle looks like [a99_list, b99_list, c99_list, ...]
temp = []
for inner in middle:
# inner looks like [astr-N, bstr-Y, cstr-Y, ...]
temp.extend(select(inner, '-Y'))
OUTPUT.append(temp)
There is no need to make a copy of the input list.
--
Steven
More information about the Tutor
mailing list