2010-03-15 16 views
19

मैं एक समारोह है कि एक सूची [1,5,3,6,...] जान और देता है [1,1,5,5,3,3,6,6,...] किसी भी विचार कैसे करना है लिखना चाहते हैं? धन्यवादएक सूची में प्रत्येक सदस्य नकल - अजगर

+2

होमवर्किश लगता है। तत्वों को डुप्लिकेट करने की तुलना में सूची के साथ काम करने के बेहतर तरीके हैं। –

उत्तर

12
>>> a = [1, 2, 3] 
>>> b = [] 
>>> for i in a: 
    b.extend([i, i]) 


>>> b 
[1, 1, 2, 2, 3, 3] 

या

>>> [a[i//2] for i in range(len(a)*2)] 
[1, 1, 2, 2, 3, 3] 
+0

आपको पायथन 2 में भी फर्श डिवीजन के लिए '//' का उपयोग करना चाहिए। –

+0

@ माइक: निश्चित रूप से सही है, '/ 'डिवीजन बीमा में पाठ्यक्रम को छोड़कर' int' वापस आ गया है। – SilentGhost

38
>>> a = range(10) 
>>> [val for val in a for _ in (0, 1)] 
[0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9] 

N.B. _ परंपरागत रूप से प्लेसहोल्डर चर नाम के रूप में उपयोग किया जाता है जहां आप चर की सामग्री के साथ कुछ भी नहीं करना चाहते हैं। इस मामले में यह बाहरी लूप के चारों ओर हर बार दो मान उत्पन्न करने के लिए प्रयोग किया जाता है।

इसे किसी जनरेटर में सूची से बदलने के लिए राउंड ब्रैकेट वाले स्क्वायर ब्रैकेट को प्रतिस्थापित करें।

+1

'_' है, इन दिनों, i18n/l10n (google) के लिए उपयोग किया जाता है। मैं अभी भी इसका उपयोग करता हूं * अगर * मुझे पता है कि इस मॉड्यूल में i18n नहीं होगा। अन्यथा मैं()) '__' (दो अंडरस्कोर) का उपयोग करूंगा। –

1

मैं का प्रयोग करेंगे

import itertools 
foo = [1, 5, 3, 6] 
new = itertools.chain.from_iterable([item, item] for item in foo) 

new पुनरावर्तक हो जाएगा कि lazily दोहराया से अधिक आइटम दोहराता। यदि आपको गणना की गई वास्तविक सूची की आवश्यकता है, तो आप list(new) कर सकते हैं या अन्य समाधानों में से एक का उपयोग कर सकते हैं।

+1

या छोटा: 'itertools.chain.from_iterable (itertools.izip (foo, foo))' –

+0

मैंने उस कोड को छोटा माना जो मेरे लिए स्पष्ट नहीं था। –

6

आप पहले से ही itertools के लिए roundrobin नुस्खा दस्तावेज़ में वर्णित है -और यह काफी है काम-तो आप उपयोग कर सकते हैं

roundrobin(my_list, my_list) 
+0

+1, यह इसे पूरा करने का एक अच्छा तरीका है। –

1

के रूप में ज्यादा गुइडो कार्यात्मक ऑपरेटरों नापसंद के रूप में के लिए, वे सुंदर हो सकता है रफ़ू काम:

>>> from operator import add 
>>> a = range(10) 
>>> b = reduce(add, [(x,x) for x in a]) 
+0

कम करने के मामले में, आसान अक्सर आश्चर्यजनक धीमी गति से होता है। यह मापना महत्वपूर्ण है कि 'कम करें' क्या कर रहा है। अक्सर, यह चौंकाने वाला है कि कितना गणना बल को कम करती है। –

+0

मैंने बेसलिस्ट = रेंज (10) और 1,000,000 पुनरावृत्तियों के साथ इस पृष्ठ पर प्रत्येक विधि के साथ एक टेस्ट स्क्रिप्ट बनाई है। सबसे धीमे 5.094 सेकेंड ले गए और सबसे तेज़ 3.622 सेकेंड लगे। मेरा कम उदाहरण 3.906 सेकंड लिया। –

+1

'रेंज (10) 'छोटा है, इसलिए जटिलता एक छोटी भूमिका निभाती है। यह समाधान वर्गबद्ध है; मैं जो अन्य देखता हूं वह रैखिक हैं। इसके अलावा, कुछ अन्य मेरे लिए अधिक पठनीय लगते हैं। –

8

मैं zip और itertools.chain का प्रयोग करेंगे।

>>> import itertools 
>>> l = [1,5,3,6,16] 
>>> list(itertools.chain(*zip(l,l))) 
[1, 1, 5, 5, 3, 3, 6, 6, 16, 16] 

नोट: मैं केवल list इस्तेमाल किया यह मुद्रण के लिए फिट बनाने के लिए जनरेटर का उपभोग करने के। आपको शायद अपने कोड में list कॉल की आवश्यकता नहीं है ...

1

यह संभव उपयोग सूची गुणा है। केस आपको प्रत्येक सूची सदस्य को एक साथ क्रमबद्ध विधि का उपयोग करने की आवश्यकता है।

>>> lst = [1,2,3,4] 
>>> sorted(lst*2) 
[1,1,2,2,3,3,4,4] 
+0

क्या आप मूल सूची का ऑर्डर रखना चाहते हैं? अगर सूची में आइटम अपरिवर्तनीय हैं तो क्या होगा? – Moberg

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