2012-02-01 11 views
38

मुझे पाइथन में इन चार if एस लिखने की आवश्यकता है। ध्यान दें कि यह क्या करता है, लूप में चार संभावित राज्यों के बीच बदल रहा है: 1,0 -> 0,1 -> -1,0 -> 0,-1 और पहले वापस।क्या इन ifs nicer लिखने का कोई तरीका है?

if [dx, dy] == [1,0]: 
    dx, dy = 0, 1 
if [dx, dy] == 0, 1: 
    dx, dy = -1, 0 
if [dx, dy] == [-1, 0] 
    dx, dy = 0, -1 
if [dx, dy] == [0, -1]: 
    dx, dy = 1, 0 

क्या कोई मुझे यह लिखने के लिए एक बेहतर/अच्छा तरीका सुझा सकता है?

+8

मैं एक अजगर विशेषज्ञ नहीं हूँ, लेकिन यह एक राज्य संक्रमण मेज की तरह लग रहा है, तो मैं उन्हें एक dict में रहना होगा जहां कुंजी राज्य से है, और मूल्य राज्य है। –

+9

क्या आपका मतलब 3,5,7 लाइनों पर 'elif' था? क्योंकि एक जंगली हंस का पीछा करते हुए 1,0 फिर से 1,0 पर वापस ले लिया जाएगा! – wim

+0

@ विम: दरअसल, '1, 0' अपेक्षित के रूप में' 0, 1' बन जाएगा, क्योंकि '[dx, dy] == 0, 1' हमेशा झूठा होता है। –

उत्तर

156
dx, dy = -dy, dx 

संदेह में, गणित लागू करें। ;)

+2

आह, सादगी :-) – stiank81

55

मैग्नस 'सुझाव शक नहीं आपके सवाल का सही जवाब के रूप में उत्पन्न है, लेकिन सामान्य रूप से कहें, आप इस तरह की समस्याओं के लिए एक शब्दकोश का उपयोग करना चाहते: यहां तक ​​कि इस मामले मैं सकता है में

statemap = {(1, 0): (0, 1), (0, 1): (-1, 0), (-1, 0): (0, -1), (0, -1): (1, 0)} 

dx, dy = statemap[dx, dy] 

एक शब्दकोश का उपयोग करना बहस बेहतर है, क्योंकि यह स्पष्ट है कि वास्तव में चार राज्य हैं और वे दोहराते हैं, लेकिन की सभी सुंदर गणित की सुंदर सुंदरता का विरोध करना मुश्किल है।

dx, dy = 1, 0 

बग है जो:

वैसे, अपने प्रश्न में कोड उस में एक बग है, और, यह सोचते हैं कि मानों आप के लिए परीक्षण केवल संभावित मान रहे हैं, के बराबर है आपको दूसरी और बाद की स्थितियों के लिए elif की आवश्यकता है, अन्यथा आप उन्हें बदलने के बाद dx और dy का परीक्षण जारी रख रहे हैं। यदि वे 1 और 0 हैं, तो आपकी सभी स्थितियां सत्य होंगी और वे अंत में इसे समाप्त कर देते हैं! यदि वे 0 और 1 के रूप में शुरू होते हैं तो दूसरी और सभी बाद की स्थितियां सत्य होंगी, और आप फिर से 1, 0 के साथ समाप्त हो जाएंगे। और इतने पर ...

6

मैं मैग्नस 'जवाब के साथ जाना होगा, वहीं यहां मानों का एक सेट से अधिक घूर्णन के लिए अभी तक एक और तरीका है:

def rotate(*states): 
    while 1: 
     for state in states: 
      yield state 

for dx, dy in rotate((1, 0), (0, 1), (-1, 0), (0, -1)): 
    pass 

ध्यान दें कि वहाँ for dx, dy पाश में कहीं एक break होना चाहिए वरना यह होगा कभी खत्म नहीं।

+4

['itertools.cycle (...)'] (http://docs.python.org/library/itertools.html#itertools.cycle), जबकि सटीक ड्रॉप-इन नहीं है आपका 'घुमावदार', एक ही समस्या को हल कर सकता है। –

+0

दरअसल, 'चक्र' के बारे में भूल गए। धन्यवाद। – yak

18

जिन मूल्यों के साथ आप काम कर रहे हैं वे एक यूनिट वेक्टर होते हैं जो लगातार घूमते हैं - दूसरे शब्दों में, phasorComplex numbers are coordinates, तो:

# at initialization 
phase = 1 
# at the point of modification 
phase *= 1j 
dx, dy = phase.real, phase.imag 

dx के अर्थ मेरी व्याख्या मान लिया जाये कि, उप मूल्यों सही यह आपके मामले में अतिरिक्त लचीलापन प्रदान करता है यह बाद में पता चला है कि आप हर कदम में कुछ अन्य राशि से घुमाना चाहते हैं।

31

बस मैग्नस का जवाब बढ़ा रहा है। यदि आप एक वेक्टर के रूप में [dx, dy] की कल्पना करते हैं, तो आप वास्तव में क्या कर रहे हैं rotation 90 डिग्री (या पीआई/2) है।

इस गणना करने के लिए, आप निम्न परिवर्तन का उपयोग कर सकते हैं:

two dimensional rotation

कौन सा आपके मामले में अनुवाद करने के लिए:

:

x = x * cos(90) - y * sin(90) 
y = x * sin(90) + y * cos(90) 

sin(90) = 1 के बाद से और cos(90) = 0 हम करने के लिए इसे आसान बनाने

x, y = -y, x 

और वहां आपके पास है!

+5

हालांकि मैग्नस हॉफ में लालित्य के लिए +1 हो सकता है, मुझे विश्वास है कि यह लालित्य के व्युत्पन्न के लिए +1 होना चाहिए। – oaxacamatt

+0

यह मैग्नस हॉफ के उत्तर और खान के बीच संबंध भी प्रदर्शित करता है। –

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