2012-02-26 14 views
62

संभव डुप्लिकेट:
Efficient way to shift a list in pythonअजगर सूची रोटेशन

मैं सही करने के लिए मदों की एक मनमाना संख्या से एक अजगर सूची बारी बारी से या बाईं ओर (एक नकारात्मक का उपयोग कर करना चाहते हैं उत्तरार्द्ध तर्क)।

कुछ इस तरह:

>>> l = [1,2,3,4] 
>>> l.rotate(0) 
[1,2,3,4] 
>>> l.rotate(1) 
[4,1,2,3] 
>>> l.rotate(-1) 
[2,3,4,1] 
>>> l.rotate(4) 
[1,2,3,4] 

यह कैसे किया जा सकता है?

+2

मैं पायथन का उपयोग नहीं करता, लेकिन यदि आपके पास पुश/पॉप विधि है, तो आप l.push (l.pop()) कर सकते हैं। फिर इसे लूप के लिए। वह आगे बढ़ने को कवर करेगा। –

+0

क्या [यह प्रश्न] (http://stackoverflow.com/questions/2150108/efficient-way-to-shift-a-list-in-python) मदद करता है? – simchona

+0

यह प्रश्न संबंधित प्रतीत होता है: http://stackoverflow.com/questions/1212025/moving-values-in-a-list-in-python –

उत्तर

118
def rotate(l, n): 
    return l[-n:] + l[:-n] 

अधिक पारंपरिक दिशा:

def rotate(l, n): 
    return l[n:] + l[:n] 

उदाहरण:

example_list = [1, 2, 3, 4, 5] 

rotate(example_list, 2) 
# [3, 4, 5, 1, 2] 

तर्क rotate के लिए एक सूची और एक पूर्णांक पारी को संकेतित करते हैं। फ़ंक्शन slicing का उपयोग करके दो नई सूचियां बनाता है और इन सूचियों का concatenatenation देता है। rotate फ़ंक्शन इनपुट सूची को संशोधित नहीं करता है।

+0

अच्छा और सरल। हालांकि यह प्रश्न में निर्दिष्ट विपरीत दिशा को विपरीत दिशा में घुमाता है। –

+0

लालित्य से प्यार करो! – varunl

+0

@DrewNoakes ऐसा करता है ... – YXD

82

यदि लागू हो, आप एक समाधान के रूप collections.deque इस्तेमाल कर सकते हैं:

import collections 

d = collections.deque([1,2,3,4,5]) 
d.rotate(3) 

print d 
>>> deque([3, 4, 5, 1, 2]) 

एक बोनस के रूप में, मैं इसे में निर्मित सूची की तुलना में तेजी होने की उम्मीद थी।

def rotate(l, x): 
    return l[-x:] + l[:-x] 

ध्यान दें कि यह केवल मूल सूची वापस आ जाएगी अगर x रेंज [-len(l), len(l)] बाहर है:

+3

भविष्य के पाठकों के लिए: 'collections.deque rotate() 'https://wiki.python.org/moin/TimeComplexity – Geoff

+0

के अनुसार स्लाइसिंग से तेज़ है, यह उल्लेख नहीं किया जाना चाहिए कि संग्रह डिफ़ॉल्ट रूप से बाईं ओर घूम रहा है? –

+0

@HasanIqbalAnik deque.rotate दाएं को घुमाता है https://docs.python.org/3/library/collections.html#collections.deque.rotate – miles82

14

निम्नलिखित समारोह सूची l, सही करने के लिए रिक्त स्थान x रोटेट किए जाएंगे। यह x के सभी मानों के लिए काम करने के लिए, उपयोग करें:

def rotate(li, x): 
    return li[-x % len(li):] + li[:-x % len(li)] 
+0

क्या 'वापसी' के बिना इसका कोई तरीका है? मैंने कोशिश की 'एल = एल [एन:] + एल [: एन]' लेकिन जब मैं 'एल' वापस करने की कोशिश करता हूं तो मुझे मूल मिलता है। – GinKin

+0

@GinKin क्यों वापसी के बिना? इस तरह आप एक समारोह से चीजें वापस करते हैं। मेरा मतलब है, आप एक लैम्ब्डा का उपयोग कर सकते हैं, लेकिन यह सिर्फ वापसी को अंतर्निहित बनाता है। –

+0

मैं इसे 'जगह में' बनाना चाहता हूं, इसलिए यह कुछ भी वापस नहीं करेगा और यदि मैं फ़ंक्शन चलाने के बाद '>>> l' टाइप करूंगा तो मुझे एक घुमावदार सूची मिल जाएगी, मूल नहीं। – GinKin

4
>>> l=[1,2,3,4] 
>>> l[1:]+l[:1] 
[2, 3, 4, 1] 
>>> l=[1,2,3,4] 
>>> l[2:]+l[:2] 
[3, 4, 1, 2] 
>>> l[-1:]+l[:-1] 
[4, 1, 2, 3] 

एक सामान्य बाईं या दाईं ओर (नकारात्मक y) (rotate करने के लिए कॉल में सकारात्मक वाई) को n बारी बारी से तो:

def rotate(l, y=1): 
    if len(l) == 0: 
     return l 
    y = y % len(l) # Why? this works for negative y 

    return l[y:] + l[:y] 

यदि आप रोटेशन की दिशा को अपने उदाहरण के समान होना चाहते हैं, तो बस y को घुमाएं।

def rotate(l, y=1): 
    if len(l) == 0: 
     return l 
    y = -y % len(l)  # flip rotation direction 

    return l[y:] + l[:y] 
संबंधित मुद्दे