List comprehension returning subclassed list type?

S

Shane Geiger

To the best of my understanding, this answers your question:

iterable
A container object capable of returning its members one at a
time. Examples of iterables include all sequence types (such as
list, str, and tuple) and some non-sequence types like dict and
file and objects of any classes you define with an __iter__()
or __getitem__() method. Iterables can be used in a for loop
and in many other places where a sequence is needed (zip(),
map(), ...). When an iterable object is passed as an argument
to the builtin function iter(), it returns an iterator for the
object. This iterator is good for one pass over the set of
values. When using iterables, it is usually not necessary to
call iter() or deal with iterator objects yourself. The for
statement does that automatically for you, creating a temporary
unnamed variable to hold the iterator for the duration of the
loop. See also iterator, sequence, and generator.


bullockbefriending said:
Given:

class Z(object):
various defs, etc.

class ZList(list):
various defs, etc.

i would like to be able to replace

z_list = ZList()
for y in list_of_objects_of_class_Y:
z_list.append(y)


with something like this:

z_list = [Z(y.var1, y.var2,..) for y in list_of_objects_of_class_Y]

Of course this just gives me a plain list and no access to the
methodsof z_list. I could, of course go and write a static method in
ZList which takes a plain list of Z objects and returns a ZList.

Anyway, my question is whether or not this can be done more elegantly
via list comprehension?

--
Shane Geiger
IT Director
National Council on Economic Education
(e-mail address removed) | 402-438-8958 | http://www.ncee.net

Leading the Campaign for Economic and Financial Literacy
 
B

bullockbefriending bard

Given:

class Z(object):
various defs, etc.

class ZList(list):
various defs, etc.

i would like to be able to replace

z_list = ZList()
for y in list_of_objects_of_class_Y:
z_list.append(y)


with something like this:

z_list = [Z(y.var1, y.var2,..) for y in list_of_objects_of_class_Y]

Of course this just gives me a plain list and no access to the
methodsof z_list. I could, of course go and write a static method in
ZList which takes a plain list of Z objects and returns a ZList.

Anyway, my question is whether or not this can be done more elegantly
via list comprehension?
 
P

Pierre Quentel

Given:

class Z(object):
various defs, etc.

class ZList(list):
various defs, etc.

i would like to be able to replace

z_list = ZList()
for y in list_of_objects_of_class_Y:
z_list.append(y)

with something like this:

z_list = [Z(y.var1, y.var2,..) for y in list_of_objects_of_class_Y]

Of course this just gives me a plain list and no access to the
methodsof z_list. I could, of course go and write a static method in
ZList which takes a plain list of Z objects and returns a ZList.

Anyway, my question is whether or not this can be done more elegantly
via list comprehension?

Hello,

A list comprehension will give you a list. But you can use a generator
expression :

z_list = ZList(Z(y.var1, y.var2,..)
for y in list_of_objects_of_class_Y)

Regards,
Pierre
 
S

Steven D'Aprano

z_list = [Z(y.var1, y.var2,..) for y in list_of_objects_of_class_Y]

Of course this just gives me a plain list and no access to the
methodsof z_list.

List comprehensions give you a list. If you want to convert that list into
the type of z_list, you need to do it yourself. Since ZList sub-classes
from list, probably the easiest way is just:

z_list = ZList([some list comprehension here])

I could, of course go and write a static method in
ZList which takes a plain list of Z objects and returns a ZList.

Yes, that would be one such way. Another way is:

z_list.extend([some list comprehension here])

If you are using a recent enough version of Python, you probably don't
even need the list comprehension. Just use a generator expression:

z_list.extend(Z(y.var1, y.var2,..) for y in list_of_objects_of_class_Y)

That's especially useful if the list of objects is huge, because it avoids
creating the list twice: once in the list comp, and once as z_list.
 
B

bullockbefriending bard

Thanks! I went with extend and generator expression as I *am* dealing
with rather a lot of data. Now I think I'm going to go on a little
hunt through my code looking for more places where I should replace
list comprehensions with generator expressions - bit of a newbie here.

z_list = [Z(y.var1, y.var2,..) for y in list_of_objects_of_class_Y]
Of course this just gives me a plain list and no access to the
methodsof z_list.

List comprehensions give you a list. If you want to convert that list into
the type of z_list, you need to do it yourself. Since ZList sub-classes
from list, probably the easiest way is just:

z_list = ZList([some list comprehension here])
I could, of course go and write a static method in
ZList which takes a plain list of Z objects and returns a ZList.

Yes, that would be one such way. Another way is:

z_list.extend([some list comprehension here])

If you are using a recent enough version of Python, you probably don't
even need the list comprehension. Just use a generator expression:

z_list.extend(Z(y.var1, y.var2,..) for y in list_of_objects_of_class_Y)

That's especially useful if the list of objects is huge, because it avoids
creating the list twice: once in the list comp, and once as z_list.
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,763
Messages
2,569,562
Members
45,038
Latest member
OrderProperKetocapsules

Latest Threads

Top