2014-06-14 7 views
16

मैं n बार सूची के प्रत्येक तत्व को दोहराता हूं और एक नई सूची बना सकता हूं? उदाहरण के लिए:किसी सूची के तत्वों को दो बार दोहराएं

x=[1,2,3,4] 
n=3 

x1=[1,1,1,2,2,2,3,3,3,4,4,4] 

x*n काम नहीं करता है

for i in x[i] 
    x1=n*x[i] 

एक सरल और स्मार्ट तरीका होना चाहिए।

+2

कैसे की जाती है 'शामिल pandas'? आप वास्तव में क्या हासिल करने की कोशिश कर रहे हैं? आपने जो कोशिश की है उसके साथ क्या गलत है? – jonrsharpe

उत्तर

13

मामले में आप वास्तव में सूची के रूप में परिणाम चाहते हैं, और जनरेटर पर्याप्त नहीं है: आप यथा-स्थान सूची को संशोधित करना चाहते हैं

import itertools 
lst = range(1,5) 
list(itertools.chain.from_iterable(itertools.repeat(x, 3) for x in lst)) 

Out[8]: [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4] 
3

एक नेस्टेड सूची कंप्यूटर अनुप्रयोग यहाँ काम करता है:

>>> [i for i in range(10) for _ in xrange(3)] 
[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9] 

या अपने उदाहरण का उपयोग करने के लिए:

>>> x = [1, 2, 3, 4] 
>>> n = 3 
>>> [i for i in x for _ in xrange(n)] 
[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4] 
0
import itertools 

def expand(lst, n): 
    lst = [[i]*n for i in lst] 
    lst = list(itertools.chain.from_iterable(lst)) 
    return lst 

x=[1,2,3,4] 
n=3 
x1 = expand(x,3) 

print(x1) 

देता है:

[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4] 

स्पष्टीकरण:

कर, [3]*3n के साथ इस जगह [3,3,3] का परिणाम देता है, हम [3,3,3,...3] (n times) प्राप्त एक सूची समझ हम सूची के प्रत्येक ELEM के माध्यम से जाने के लिए और इस कार्रवाई को कर सकते हैं का उपयोग करना, अंत में हम सूची है, जो हम list(itertools.chain.from_iterable(lst)) द्वारा कर सकते हैं समतल करने की जरूरत है

+0

'itertools.chain (* x) 'इन दिनों को' itertools.chain.from_iterable (x) ' – mgilson

+0

@mgilson के रूप में लिखा जाना चाहिए: धन्यवाद! – Dair

+1

कोई समस्या नहीं है। मैं एक अपेक्षाकृत बार देखता हूं। पूर्व के साथ समस्या यह है कि यह अनपॅकिंग ऑपरेटर की योग्यता के आधार पर आपके टिकाऊ को हल करता है जो आंशिक रूप से 'itertools' की अद्भुत आलस्य को हरा देता है। – mgilson

10

आप सूची समझ का उपयोग कर सकते हैं:

[item for item in x for i in range(n)] 

इस रूप में चलता है:

>>> x=[1,2,3,4] 
>>> n=3 
>>> new = [item for item in x for i in range(n)] 
>>> new 
[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4] 
>>> 

यह एक अधिक वर्बोज़ नेस्टेड for पाश रूप में ही है:,

new = [] 
for item in x: 
    for i in range(n): 
     new.append(i) 

या, का उपयोग कर के रूप में आप अपने टैग में अनुरोध:

pandas.Index.repeat(np.array([1, 2, 3, 4]), 3) 

>>> import pandas, numpy as np 
>>> x = [1, 2, 3, 4] 
>>> n = 3 
>>> new = pandas.Index.repeat(np.array([1, 2, 3, 4]), 3) 
>>> new 
array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]) 
>>> 
+0

pandas.Index.repeat np.repeat –

+0

@AndyHayden पर कॉल करें, लेकिन ओपी टैग किया गया [टैग: पांडा] –

+0

मुझे लगता है कि, लेकिन 'pandas.Index.repeat' __is__ np.repeat (एक ndarray विधि के रूप में), यहां कोई पांडा जादू नहीं है, ऐसा लगता है कि इसके लिए पांडा को कॉल करना मूर्खतापूर्ण लगता है (विशेष रूप से जब यह इंडेक्स नहीं है!)। बस 'np.array ([1, 2, 3, 4]) करने के लिए बेहतर है। दोहराना (3) '। –

39

आदर्श रास्ता शायद numpy.repeat:

In [16]: 

x1=[1,2,3,4] 
In [17]: 

np.repeat(x1,3) 
Out[17]: 
array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]) 
+1

यह स्वीकार्य उत्तर होना चाहिए! –

0

, सबसे अच्छा तरीका है पीछे से पुनरावृति और एक आवंटित करने के लिए है n बार उस आइटम की सूची में पहले एक आइटम का टुकड़ा क्या था।

यह टुकड़ा काम की वजह से काम करता है:

>>> ls = [1, 2, 3] 
>>> ls[0: 0+1] 
[1] 
>>> ls[0: 0+1] = [4, 5, 6] 
>>> ls 
>>> [4, 5, 6, 2, 3] 
def repeat_elements(ls, times): 
    for i in range(len(ls) - 1, -1, -1): 
     ls[i: i+1] = [ls[i]] * times 

डेमो उपयोग:

>>> a = [1, 2, 3] 
>>> b = a 
>>> b 
[1, 2, 3] 
>>> repeat_elements(b, 3) 
>>> b 
[1, 1, 1, 2, 2, 2, 3, 3, 3] 
>>> a 
[1, 1, 1, 2, 2, 2, 3, 3, 3] 

(आप में जगह इसे संशोधित नहीं करना चाहते हैं, तो आप कॉपी कर सकते हैं सूची और प्रतिलिपि वापस करें, जो मूल को संशोधित नहीं करेगा। यह अन्य अनुक्रमों के लिए भी काम करेगा, जैसे tuple एस, लेकिनकी तरह आलसी नहीं हैऔर itertools.repeat विधि)

def repeat_elements(ls, times): 
    ls = list(ls) # Makes a copy 
    for i in range(len(ls) - 1, -1, -1): 
     ls[i: i+1] = [ls[i]] * times 
    return ls 
1

एक आसान तरीका प्राप्त करने के लिए इस n साथ सूची x गुणा और जिसके परिणामस्वरूप सूची को सॉर्ट करने। जैसे

>>> x = [1,2,3,4] 
>>> n = 3 
>>> a = sorted(x*n) 
>>> a 
>>> [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4] 

यह भी काम करेगा, तो अपनी सूची तत्वों चरित्र:

>>> x = ['a','b','c','d'] 
>>> n = 3 
>>> a = sorted(x*n) 
>>> a 
>>> ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'] 
संबंधित मुद्दे