วิธีสร้างมากกว่าหนึ่งรายการจากรายการโดยใช้ฟังก์ชันเป็นภาษาไพธอน

0

คำถาม

ฉันกำลังพยายามทำ 8 ปริศนาเป็นคนแก้ปัญหาโดยใช้ต่างกันดร.ปาร์,อย่างเช่น BFS,DFS มี*เป็นต้น ใช้ไพธอน. สำหรับคนที่ไม่คุ้นเคยกับปัญหา,8 ปริศนาปัญหาคือเกม consisting 3 ของแถวและ 3 ๆคอลัมน์ คุณสามารถย้ายเปล่าหั่นชิ้นเรียงต่อเนื่องเดียวที่พอเหมาะทางแนวนอนหรือทางแนวตั้ง,0 เป็นตัวแทนของว่างหั่นชิ้นเรียงต่อเนื่อง. มันดูเหมือนนี้(ฉันไม่สามารถเพิ่มภาพต่างๆเนื่องจากบัญชีของฉันชื่อเสียงของ):

https://miro.medium.com/max/679/1*yekmcvT48y6mB8dIcK967Q.แฟ้มภาพประเภท pngname

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 obtains เป็นการอ้างอิงไปที่โกลบอล initial_state และไม่ใช่โคลนของมัน ดังนั้นทั้งสองโทรศัพท์ swap_positions mutate เดียวกันอาเรย์. วิธีแก้ปัญหาจะเป็นโคลนอาเรย์นแรกของโทรหา: 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:ฉันมี renamed ของคุณ vairable list ต้อง statesไม่อย่างนั้นมันจะเงาของคนสร้างขึ้นในรายชื่อฟังก์ชัน

ด้านข้างข้อที่ 2: find_new_nodes ไม่ได้ทำงานกับพารามิเตอร์แทนการใช้มันคนโกลบอลในรายชื่อ ฉันเปลี่ยนมันเหมือนกัน

ด้านโน้ต 3:มีวิธีที่แตกต่างกันเพื่อสร้างสำเนาของของคุณ(ตื้น)รายการ ฉันคิดว่า list.copy() เป็นส่วนใหญ่ verbose หนึ่ง คุณอาจจะยังใช้คัดลอกมอดูลใช้ [:] หรืออย่างอื่น

แสดงผล:

([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. พยายามที่จะไม่ได้ใช้งาน"รายการ"เป็นตัวแปรมันเป็นภาษาไพธอนวนแสดงตัวสำหรับ"รายการ"แบบนั้น มันดูเหมือนว่าคุณเป็น redefining ที่จะครบกำหนดคลอดแล้วค่ะ

  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ý
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่