2012-12-19 15 views
5

मैं ऐसा करके tuples मैं बनाने के खोल के लिए निम्न चाहते तो वह परिणाम सिर्फ एक सरल सूची है। मैं वांछित परिणाम 2-3 लाइनों में प्राप्त कर सकता हूं लेकिन निश्चित रूप से एक oneliner list.comp है? मैं सक्षम होना चाहिएअजगर सूची समझ, खोल और कई आपरेशनों

y = [(i, sqrt(i), i**3, some_operation_on_i, f(i), g(i)) for i in x] 

उदाहरण के लिए:

x = range(10) 
y = [(i,j**2) for i,j in zip(x,x)] 
>>>y 
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49), (8, 64), (9 
, 81)] 
>>> 

मैं क्या चाहता हूँ result = [0,0,1,1,2,4,3,9.....]

कर

y = len(x)*[0] 
y[::2] = x 
y[1::2] = [i**2 for i in x] 

देता है कि मैं क्या चाहते हैं, लेकिन क्या हुआ अगर मैं और अधिक सामान्य स्थिति की जरूरत है परिणाम की तरह एक सीधी सूची प्राप्त करने के लिए जहां मैंने केवल एक ऑपरेशन (वर्ग) निर्दिष्ट किया है, लेकिन प्रत्येक का पालन करने के लिए अब प्रत्येक के बाद संचालन की मनमानी संख्या के साथ।

उत्तर

12
>>> import itertools 
>>> list(itertools.chain(*y)) 
[0, 0, 1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81] 
11

एक नेस्टेड सूची समझ का उपयोग करें:

result = [a for tup in y for a in tup] 

उदाहरण:

>>> x = range(10) 
>>> y = [(i,j**2) for i,j in zip(x,x)] 
>>> [a for tup in y for a in tup] 
[0, 0, 1, 1, 2, 4, 3, 9, 4, 16, 5, 25, 6, 36, 7, 49, 8, 64, 9, 81] 

यह रूप में अच्छी तरह से अपने अधिकतर सामान्य मामले के लिए ठीक से काम करेंगे, या आप इसे एक ही बार में कर सकता है :

y = [a for i in x for a in (i, sqrt(i), i**3, some_operation_on_i, f(i), g(i))] 

नी sted सूची comprehensions, अजीब लग रही है यहाँ यह एक सामान्य for लूप के रूप में दिखाई देंगे है:

y = [] 
for i in x: 
    for a in (i, sqrt(i), i**3, some_operation_on_i, f(i), g(i)): 
     y.append(a) 
+0

नेस्ट भूल गए सूची पूरी तरह से comps, धन्यवाद। इसे स्वीकार करना क्योंकि यह तेज़ तरीका है और यह list.comp में करता है। मैं मानता हूं कि यह अजीब है, लेकिन मुझे लगता है कि मुझे प्रति 4-5 से अधिक संचालन की आवश्यकता नहीं होगी। – arynaq

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