2015-11-04 9 views
5

स्ट्रिंग '1234' पर विचार करें। आपको एक फ़ंक्शन की आवश्यकता है जो सभी घूर्णन उत्पन्न करता है: '1234', '3412', '4123', '2341'स्ट्रिंग रोटेशन उत्पन्न करने के लिए पाइथोनिक तरीका

assert rotations('123') == set(['123', '231', '312']) 
assert rotations('111') == set(['111']) 
assert rotations('197') == set(['197', '971', '719']) 

ऐसा करने के लिए pythonic तरीका क्या है: मैं एक साधारण परीक्षण सूट बनाया? मैं

def rotations(num): 
    str_num = str(num) 
    result = set() 
    for mid in xrange(len(str_num)): 
     result.add(
      str_num[mid:] + str_num[:mid] 
     ) 
    return result 
+3

यदि यह ** कामकाजी कोड ** है जो आपको लगता है कि सुधार किया जा सकता है, तो [codereview.se] देखें। – jonrsharpe

+3

शायद एक सेट समझ है? '{s [mid:] + s [मध्य] श्रेणी में मध्य (लेन))} –

+1

आपके पास पाइथनिक पर्याप्त है - हालांकि @ निकलासबी की टिप्पणी, जो शायद एक स्वीकार्य उत्तर होने योग्य है , शायद अधिक है (हालांकि पायथन 2 में 'xrange' द्वारा' रेंज' को प्रतिस्थापित करें) –

उत्तर

3
s='1234' 
z = {s[x:]+s[:x] for x in range(len(s))} 
3

आपका दूसरे उदाहरण पता चलता है कि अपने दृष्टिकोण कुशल यदि संख्या आवधिक है नहीं है (उदा 123,123,123,123) नीचे दिए गए कोड के साथ समाप्त हो गया। एक समाधान के रूप में - जांचें कि दिया गया रोटेशन पहले से ही दिखाई दे रहा है या नहीं। यदि ऐसा है तो - अनुक्रम समय-समय पर है और आप पहले से ही सब अलग पहचाना रोटेशन की खोज की है, तो बस परिणाम लौट:

def rotations(num): 
    str_num = str(num) 
    result = set() 
    for mid in range(len(str_num)): 
     rot = str_num[mid:] + str_num[:mid] 
     if rot in result: 
      return result 
     else: 
      result.add(rot) 
    return result 

(मैं range करने के लिए अपने xrange बदल के बाद से मैं अजगर 3 का उपयोग कर रहा है - आप निश्चित रूप से परिवर्तन के कर सकते हैं वापस)।

2

हालांकि निश्चित रूप से सबसे तेज़ या जरूरी अधिकांश पायथनिक उत्तर नहीं है, तो आप इसके लिए collections.deque का उपयोग कर सकते हैं।

from collections import deque 

def rotations(s): 
    s_dq = deque(s) 
    result = set() 
    for _ in xrange(len(s_dq)): 
     s_dq.rotate(1) 
     result.add(''.join(s_dq)) 
    return result 

और यह आपके उदाहरण परीक्षण के सभी गुजरता है:

def main(): 
    tests = ['123', 
      '111', 
      '197'] 

    desired = [set(['123', '231', '312']), 
       set(['111']), 
       set(['197', '971', '719'])] 

    for test, result in zip(tests, desired): 
     print rotations(test) == result 

if __name__ == '__main__': 
    main() 

सच

सच

सच

मुझे लगता है कि आप की सिफारिश नहीं होगा इस विशेष समस्या के लिए collections.deque का उपयोग करें, लेकिन इसे इस तरह की समस्याओं के अधिक जटिल संस्करणों पर लागू किया जा सकता है। यह बहुत उपयोगी है और, मेरी राय में, अंतर्निहित उपकरण - यही कारण है कि मैंने इसे इस प्रश्न के उत्तर के रूप में शामिल किया।

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

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