2013-03-14 10 views
42

बनाने के लिए सूची समझ का उपयोग करें मैं सूची से 2-टुपल का टुपल बनाने के लिए सूची समझ का उपयोग कैसे कर सकता हूं। यहएक tuple

tup =() 
for element in alist: 
    tup = tup + ((element.foo, element.bar),) 

उत्तर

60
tup = tuple((element.foo, element.bar) for element in alist) 

तकनीकी तौर पर के बराबर होगा, यह एक generator expression है। यह एक सूची समझ की तरह है, लेकिन यह आलसी मूल्यांकन किया गया है और एक मध्यवर्ती सूची के लिए स्मृति आवंटित करने की आवश्यकता नहीं होगी।

पूर्णता के लिए, सूची समझ इस प्रकार दिखाई देगा:

tup = tuple([(element.foo, element.bar) for element in alist]) 

 

पुनश्च: attrgetter तेजी से नहीं है (alist एक लाख आइटम यहाँ है):

In [37]: %timeit tuple([(element.foo, element.bar) for element in alist]) 
1 loops, best of 3: 165 ms per loop 

In [38]: %timeit tuple((element.foo, element.bar) for element in alist) 
10 loops, best of 3: 155 ms per loop 

In [39]: %timeit tuple(map(operator.attrgetter('foo','bar'), alist)) 
1 loops, best of 3: 283 ms per loop 

In [40]: getter = operator.attrgetter('foo','bar') 

In [41]: %timeit tuple(map(getter, alist)) 
1 loops, best of 3: 284 ms per loop 

In [46]: %timeit tuple(imap(getter, alist)) 
1 loops, best of 3: 264 ms per loop 
+0

(+ 1) तकनीकी रूप से यह इंगित करने लायक हो सकता है कि यह एक सूची समझ नहीं है (लेकिन मुझे यकीन है कि ओपी दिमाग में नहीं होगा :)) – NPE

+2

आप coul डी भी 'tuple (नक्शा (ऑपरेटर .attrgetter (' foo ',' बार '), alist करते हैं)) '। मैं संभवत: आपके द्वारा पठनीयता के लिए पोस्ट किए गए एक का उपयोग करता हूं, लेकिन 'attrgetter' का थोड़ा सा प्रदर्शन लाभ हो सकता है। आपको 'टाइमिट' करना होगा और देखें कि यह वास्तविक तंग लूप में है या नहीं। – mgilson

+1

इस उदाहरण में सूची समझ और जेनरेटर अभिव्यक्ति के बीच क्या अंतर है क्योंकि tuple() को उस पर बुलाया जाता है? क्या फॉर्म के बावजूद यह एक ही स्मृति पदचिह्न का उपभोग नहीं करेगा? – Octipi

संबंधित मुद्दे