473,398 Members | 2,343 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,398 software developers and data experts.

List comprehension returning subclassed list type?

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?

Mar 25 '07 #1
4 1554
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 bard wrote:
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
sg*****@ncee.net | 402-438-8958 | http://www.ncee.net

Leading the Campaign for Economic and Financial Literacy
Mar 25 '07 #2
On 25 mar, 08:43, "bullockbefriending bard" <kinch1...@gmail.com>
wrote:
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

Mar 25 '07 #3
On Sat, 24 Mar 2007 23:43:10 -0700, bullockbefriending bard wrote:
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.

--
Steven.

Mar 25 '07 #4
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.

On Mar 25, 3:57 pm, Steven D'Aprano
<s...@REMOVE.THIS.cybersource.com.auwrote:
On Sat, 24 Mar 2007 23:43:10 -0700, bullockbefriending bard wrote:
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.

--
Steven.

Mar 25 '07 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

24
by: Mahesh Padmanabhan | last post by:
Hi, When list comprehension was added to the language, I had a lot of trouble understanding it but now that I am familiar with it, I am not sure how I programmed in Python without it. Now I...
6
by: jena | last post by:
hello, when i create list of lambdas: l=] then l() returns 'C', i think, it should be 'A' my workaround is to define helper class with __call__ method: class X: def __init__(self,s): self.s=s...
6
by: Heiko Wundram | last post by:
Hi all! The following PEP tries to make the case for a slight unification of for statement and list comprehension syntax. Comments appreciated, including on the sample implementation. ===...
4
by: Gregory Guthrie | last post by:
Sorry for a simple question- but I don't understand how to parse this use of a list comprehension. The "or" clauses are odd to me. It also seems like it is being overly clever (?) in using a...
19
by: bvdp | last post by:
Please help my poor brain :) Every time I try to do a list comprehension I find I just don't comprehend ... Anyway, I have the following bit of code: seq = tmp = for a in range(len(seq)):...
6
by: fdu.xiaojf | last post by:
Hi all, I can use list comprehension to create list quickly. So I expected that I can created tuple quickly with the same syntax. But I found that the same syntax will get a generator, not a...
1
by: Shane Lillie | last post by:
I've got a bit of code that looks like this: for i in xrange(1000): # shuffle the doors doors = random.shuffle(doors) # save the doors that have goats (by index) goats = == 'G' ]
0
by: Hatem Nassrat | last post by:
on Wed Jun 13 10:17:24 CEST 2007, Diez B. Roggisch deets at nospam.web.de wrote: Well I have looked into this and it seems that using the list comprehension is faster, which is...
5
by: Pat | last post by:
I have written chunks of Python code that look this: new_array = for a in array: if not len( a ): continue new_array.append( a ) and...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.