2012-09-02 16 views
18

आर समारोह प्रतिनिधि() एक वेक्टर के प्रत्येक तत्व प्रतिकृति (एक सूची/वेक्टर के तत्वों प्रतिकृति):आर समारोह प्रतिनिधि() पायथन में

> rep(c("A","B"), times=2) 
[1] "A" "B" "A" "B" 

यह अजगर में सूची गुणा की तरह है:

>>> ["A","B"]*2 
['A', 'B', 'A', 'B'] 

लेकिन प्रतिनिधि() आर समारोह के साथ यह भी वेक्टर के प्रत्येक तत्व के लिए पुनरावृत्ति की संख्या specifiy करना संभव है:

> rep(c("A","B"), times=c(2,3)) 
[1] "A" "A" "B" "B" "B" 

क्या Python में ऐसा कोई फ़ंक्शन availbale है? अन्यथा इसे कैसे परिभाषित किया जा सकता है? जिस तरह से मैं एक सरणी की पंक्तियों को डुप्लिकेट करने के लिए इस तरह के फ़ंक्शन में रूचि रखता हूं।

उत्तर

23

उपयोग numpy सरणियों और numpy.repeat समारोह:

import numpy as np 

x = np.array(["A", "B"]) 
print np.repeat(x, [2, 3], axis=0) 

['A' 'A' 'B' 'B' 'B'] 
9

नहीं जानते कि क्या वहाँ इस के लिए एक अंतर्निहित उपलब्ध है, लेकिन आप कुछ इस तरह की कोशिश कर सकते हैं:

>>> lis = ["A", "B"] 
>>> times = (2, 3) 
>>> sum(([x]*y for x,y in zip(lis, times)),[]) 
['A', 'A', 'B', 'B', 'B'] 

ध्यान दें कि sum() द्विघात समय में चलाता है। तो, यह अनुशंसित तरीका नहीं है।

>>> from itertools import chain, izip, starmap 
>>> from operator import mul 
>>> list(chain.from_iterable(starmap(mul, izip(lis, times)))) 
['A', 'A', 'B', 'B', 'B'] 

समय comparions:

>>> lis = ["A", "B"] * 1000 
>>> times = (2, 3) * 1000 
>>> %timeit list(chain.from_iterable(starmap(mul, izip(lis, times)))) 
1000 loops, best of 3: 713 µs per loop 
>>> %timeit sum(([x]*y for x,y in zip(lis, times)),[]) 
100 loops, best of 3: 15.4 ms per loop 
1
l = ['A','B'] 
n = [2, 4] 

आपका उदाहरण तार जो पहले से ही iterables हैं उपयोग करता है। आप एक परिणाम स्ट्रिंग का उत्पादन कर सकते हैं जो एक सूची के समान है।

''.join([e * m for e, m in zip(l, n)]) 
'AABBBB' 

अद्यतन: सूची समझ यहाँ की आवश्यकता नहीं है:

''.join(e * m for e, m in zip(l, n)) 
'AABBBB' 
+0

@ अश्विनी चौधरी सही ... आपके समाधान के लिए - लेकिन जैसा कि मैंने उपरोक्त लिखा है, मैं सूची –

+1

की बजाय स्ट्रिंग के साथ जाने का सुझाव देता हूं लेकिन आप सूची समझ भाग को छोड़ सकते हैं और केवल इसका उपयोग कर सकते हैं: '' .join (e * एम के लिए एम, ज़िप में एम (एल, एन)) ' –

+0

@ अश्विनी चौधरी कूल! ... Thx ... मैं अपना जवाब अपडेट करूंगा –

4

आप कहते हैं कि "सरणी" और आर आप उल्लेख के बाद से किसी भी तरह से numpy arrays का उपयोग करना चाह सकते हैं, और उसके बाद उपयोग करें:

import numpy as np 
np.repeat(np.array([1,2]), [2,3]) 

संपादित करें: चूंकि आप उल्लेख करते हैं कि आप पंक्तियों को दोहराना चाहते हैं, मुझे लगता है कि आपको numpy का उपयोग करना चाहिए। np.repeat में ऐसा करने के लिए अक्ष तर्क है।

अन्य तो है कि, हो सकता है:

from itertools import izip, chain, repeat 
list(chain(*(repeat(a,b) for a, b in izip([1,2], [2,3])))) 

के रूप में यह धारणा है कि आप किसी सूची या स्ट्रिंग गुणा करने के लिए है नहीं है। हालांकि मैं मानता हूं कि चेन में तर्क के रूप में सबकुछ गुजरना शायद सही नहीं है, इसलिए अपना खुद का इटरेटर लिखना बेहतर हो सकता है।

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