कैसे उत्पन्न करने के लिए एक से अधिक सूची से, एक सूची का उपयोग कर अजगर कार्यों

0

सवाल

मैं कोशिश कर रहा हूँ बनाने के लिए एक 8 पहेली समस्या solver के विभिन्न एल्गोरिदम का उपयोग, इस तरह के रूप में वित्तीय पर्यवेक्षण बोर्ड,डीएफएस, एक* आदि. अजगर का उपयोग कर. जो उन लोगों के लिए परिचित नहीं हैं के साथ समस्या है, 8 पहेली समस्या से मिलकर एक खेल है 3 पंक्तियों और 3 कॉलम । आप स्थानांतरित कर सकते हैं खाली टाइल केवल क्षैतिज या खड़ी, 0 का प्रतिनिधित्व करता है, खाली टाइल. यह इस तरह दिखता है (मैं नहीं कर सका छवियों को जोड़ने के कारण मेरे खाते प्रतिष्ठा है।):

https://miro.medium.com/max/679/1*yekmcvT48y6mB8dIcK967Q.png

initial_state = [0,1,3,4,2,5,7,8,6]
goal_state = [1,2,3,4,5,6,7,8,0]
    
def find_zero(state):
       global loc_of_zero
       loc_of_zero = (state.index(0))


def swap_positions(list, pos1, pos2):
       first = list.pop(pos1)
       second = list.pop(pos2-1)

       list.insert(pos1,second)
       list.insert(pos2,first)
       return list

 def find_new_nodes(state):
      if loc_of_zero == 0:
         right = swap_positions(initial_state,0,1)
         left = swap_positions(initial_state,0,3)
         return(right,left)




find_zero(initial_state)
print(find_new_nodes(initial_state))   

समस्या मैं यह है, मैं समारोह "find_new_nodes(राज्य)" वापसी 2 अलग-अलग सूचियों में है, तो मैं चुन सकते हैं सबसे होनहार नोड पर निर्भर करता है, एल्गोरिथ्म) और इतने पर । लेकिन उत्पादन के अपने कोड के होते हैं, दो समान सूचियों.

यह मेरी उत्पादन: ([4, 0, 3, 1, 2, 5, 7, 8, 6], [4, 0, 3, 1, 2, 5, 7, 8, 6])

मैं क्या कर सकते हैं यह सुनिश्चित करने के लिए लौटने के 2 अलग-अलग सूचियों में? मेरा लक्ष्य है वापस करने के लिए सभी संभव कदम पर निर्भर करता है, जहाँ 0 है, का उपयोग कर find_new_nodes समारोह. क्षमा याचना अगर यह एक आसान सवाल है, यह मेरी पहली बार एक परियोजना के लिए यह जटिल है.

3

सबसे अच्छा जवाब

1

समस्या यह है कि swap_positions एक संदर्भ के लिए वैश्विक initial_state और नहीं एक क्लोन । तो दोनों के लिए कॉल swap_positions रूप बदलना एक ही सरणी. एक समाधान के लिए किया जाएगा क्लोन करने के लिए सरणी पर पहली कॉल: right = swap_positions(initial_state[:],0,1)

शायद एक बेहतर समाधान के लिए swap_positions भी हो सकता है:

# please do not name variables same as builtin names
def swap_positions(lis, pos1, pos2):
       # create a new tuple of both elements and destruct it directly
       lis[pos1], lis[pos2] = lis[pos2], lis[pos1]
       return lis

यह भी देखें यहाँ

2021-11-22 13:05:24
0

तुम सच में नहीं है "दो समान सूची", आप केवल एक सूची चीज है कि तुम वापस लौट रहे हैं । से बचने के लिए संशोधित मूल सूची और भी दो के साथ काम अलग-अलग सूचियों में, आप पारित करना चाहिए प्रतियां ।

initial_state = [0,1,3,4,2,5,7,8,6]
goal_state = [1,2,3,4,5,6,7,8,0]

def find_zero(state):
    global loc_of_zero
    loc_of_zero = (state.index(0))


def swap_positions(states, pos1, pos2):
    first = states.pop(pos1)
    second = states.pop(pos2-1)

    states.insert(pos1,second)
    states.insert(pos2,first)
    return states

def find_new_nodes(states):
    if loc_of_zero == 0:
        right = swap_positions(states.copy(),0,1) # pass around a copy
        left = swap_positions(states.copy(),0,3) # pass around a copy
        return(right,left)

find_zero(initial_state)
print(find_new_nodes(initial_state))

साइड नोट 1: मैं नाम है अपने vairable list करने के लिए states, अन्यथा यह होगा, छाया में बनाया सूची समारोह

साइड नोट 2: find_new_nodes काम नहीं किया पैरामीटर के साथ, बजाय इसे इस्तेमाल किया वैश्विक सूची. मैं बदल गया है कि, भी.

साइड नोट 3: वहाँ रहे हैं अलग अलग तरीकों की प्रतिलिपि बनाने के लिए अपने (उथले) की सूची. मुझे लगता है कि list.copy() सबसे वाचाल । आप भी नकल का उपयोग मॉड्यूल, का उपयोग करें [:] या कुछ और.

आउटपुट:

([1, 0, 3, 4, 2, 5, 7, 8, 6], [4, 1, 3, 0, 2, 5, 7, 8, 6])
2021-11-22 13:06:24
0

ठीक है, सब से पहले, कुछ विचार...

  1. की कोशिश करने के लिए नहीं का उपयोग करें "सूची" के रूप में एक चर के साथ, यह एक अजगर पहचानकर्ता के लिए "सूची" प्रकार है । ऐसा लगता है कि आप पुनर्परिभाषित कर रहे हैं शब्द.

  2. आम तौर पर, यह एक बुरा विचार है का उपयोग करने के लिए वैश्विक vars इस तरह के रूप में loc_of_zero.

अपनी समस्या के बारे में:

मुझे विश्वास है कि समस्या यह है कि आप कर रहे हैं की एक बहुत हो रही के संदर्भ में एक ही चर. इसे से बचने की कोशिश. एक विचार:

from copy import deepcopy
def swap_positions(list0, pos1, pos2): 
    list1 = deepcopy(list0) 
    first = list1.pop(pos1) 
    second = list1.pop(pos2-1) 

    list1.insert(pos1,second) 
    list1.insert(pos2,first) 
    return list1 
2021-11-22 13:12:44

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में