2016-08-30 4 views
5

उदाहरण के लिए, [1, 5, 7] को [1,2,5,6,7,8] में पाइथन में कैसे परिवर्तित करें? [x, x + 1 में एक्स के लिए [1,5,7]] यकीन है के लिए काम नहीं कर सकते हैं ...पायथन में एकाधिक तत्वों में तत्व को मैप करके सूची को कैसे परिवर्तित करें?

उत्तर

3

सुनिश्चित नहीं हैं कि अगर यह सबसे अच्छा तरीका है, लेकिन मैं करना होगा:

l = [1, 5, 7] 
print([y for x in l for y in (x, x + 1)]) 

एक और तरीका है itertools.chain.from_iterable का उपयोग कर:

from itertools import chain 
l = [1, 5, 7] 
print(list(chain.from_iterable((x, x + 1) for x in l))) 
1

आप tuples के साथ अपनी सूची समझ तर्क करते हैं और उसके बाद कर सकते हैं समतल जिसके परिणामस्वरूप सूची:

[n for pair in [(x, x+1) for x in [1,5,7]] for n in pair]

0

यदि आप केवल न्यूनतम और अधिकतम + 1 मानों के बीच की संख्या के साथ सूची भरना चाहते हैं तो आप [i for i in range (min(x),max(x)+2)] का उपयोग कर सकते हैं x आपकी सूची है।

+0

ऐसा मत सोचो कि वे क्या हासिल करने की कोशिश कर रहे हैं। – 101

2

और आप हमेशा operator, imap(), partial(), izip() और chain() के साथ समस्या यह overcomplicate कर सकते हैं:

>>> from itertools import chain, izip, imap 
>>> from operator import add 
>>> from functools import partial 
>>> 
>>> l = [1, 5, 7] 
>>> 
>>> list(chain(*izip(l, imap(partial(add, 1), l)))) 
[1, 2, 5, 6, 7, 8] 

यहाँ क्या होता है:

  • हम l पर एक इटरेटर बनाने के एक add function साथ लागू होने वाला 1 एक तर्क के रूप में
  • हम प्रारंभिक एल ज़िप इटरेटर imap() द्वारा दिया एक्स के जोड़े का निर्माण करने के साथ IST, x + 1 मूल्यों
  • हम flatten the list with chain() और यह सूची में बदलने का परिणाम
+3

हाहा यह घृणित है;) – 101

+0

हाँ, हालांकि मुझे डाउनवोट समझ में नहीं आता है। यह एक कामकाजी समाधान है * एक स्पष्टीकरण * के साथ, दस्तावेज़ों के लिंक और यह भी कहता है कि मैं समझता हूं कि यह एक तरह की जटिलता है। – alecxe

+1

मुझे मारता है, मैंने इसे ऊपर उठाया। – 101

2

एक साधारण समस्या के बारे में सोचने के लिए जिस तरह से देखने के लिए एक बनाने के लिए है बढ़ती मूल्यों की दूसरी सूची और मूल सूची में जोड़ने, तो यह क्रमबद्ध करें:

l = [1, 5, 7] 
m = l + [i+1 for i in l] 
m.sort() 
print m # [1, 2, 5, 6, 7, 8] 
2

आप alecxe के जवाब से कुछ विचारों को जोड़ सकते हैं और क्या आप पहले से ही था:

>>> import itertools 
>>> 
>>> a = [1, 5, 7] 
>>> b = ((x, x+1) for x in a) 
>>> 
>>> list(itertools.chain(*b)) 
[1, 2, 5, 6, 7, 8] 

क्या मैंने किया है है:

  1. b एक generator expression जो हमें की अनुमति देता है में परिभाषित करें (कुछ है कि तरह दिखता है) एक टपल कि ((1, 2), (5, 6), (7, 8)) की तरह है, लेकिन यह अभी के मूल्यांकन के बिना देखा होता। यह एक सूची समझ के साथ भी काम किया होगा।

  2. Unpack b in the argument list itertools.chain()। यह itertools.chain((1, 2), (5, 6), (7, 8)) के बराबर होगा। वह कार्य अपने तर्कों को जोड़ता है।

  3. itertools.chain() फ़ंक्शन के वापसी मूल्य से सूची बनाने के लिए सूची() का उपयोग करें क्योंकि यह एक इटरेटर है।

यह भी किसी मध्यवर्ती चरण के बिना काम कर सकता है:

>>> import itertools 
>>> list(itertools.chain(*((x, x+1) for x in [1, 5, 7]))) 
[1, 2, 5, 6, 7, 8] 

लेकिन

मुझे आशा है कि इस मदद करता है "सरल जटिल की तुलना में बेहतर है।"

अगर मुझे अधिक प्रतिष्ठा है, तो मैं और अधिक लिंक डालता।

2

एक जेनरेटर फ़ंक्शन बनाएं जो सूची और उपज पर पुनरावृत्त करता है, बदले में, प्रत्येक तत्व और वह तत्व प्लस वन। अपने जेनरेटर पर Iterate।

def foo(lyst): 
    for element in lyst: 
     yield element 
     yield element + 1 

>>> print(list(foo([1, 5, 7]))) 
[1, 2, 5, 6, 7, 8] 
>>> 
>>> print([element for element in foo([1, 5, 7])]) 
[1, 2, 5, 6, 7, 8] 
>>> 
संबंधित मुद्दे