簡體   English   中英

python-獲取子列表而不更改位置

[英]python-get a sublist without changing position

嗨,我正在研究遺傳算法。 我想知道是否有人可以幫助我完成跨接步驟。

例:

dad=[1,2,3,4,5,6,7]
mom=[2,3,6,1,7,5,4]

我想在父親中選擇一個隨機子集,子集的大小也可以是隨機的。 例如[1,2,3]或[3,4,5]或[2,3,4]或[1,2]或[4,5]或[1,2,3,4],但它們必須是爸爸的原始順序。

例如,隨機子集為[2,3,4,5],那么我希望我的后代為[,2,3,4,5 ,,]。 然后,我想用媽媽的清單填補空缺。 我想重復媽媽的清單。 首先考慮2、2已經在列表中,所以我跳過2。然后考慮3、3也已經在列表后代中,所以我跳過3。然后6、6不在后代列表中,所以我將6加到第一個可用地點。 所以后代現在是[6,2,3,4,5 ,,]。 最終, offspring應該是[6,2,3,4,5,1,7]

任何幫助將不勝感激! 我認為我需要幫助的最困難的部分是如何進入此步驟[,2,3,4,5,,]通過媽媽列表進行迭代可能對我來說是可行的。

更新的代碼

dad=[1,2,3,4,5,6,7]
mom=[2,3,6,1,7,5,4]

upper=random.randint(0,len(dad)-1)
lower=random.randint(0,len(dad)-1)
slice=dad[lower:upper]
child=copy.deepcopy(dad)

j =0
for i in child:
    if i not in slice:
        child[j] = 0
    j+=1   
n=len(child)
h=0
k=0
while k <= len(child)-1:
    if child[k] == 0:
        if mom[h] not in slice:
            child[k]=mom[h]
            h+=1
            k+=1
        else:
            h+=1
    else:
        k+=1

生成len(dad)范圍內的兩個隨機整數(有關用法,請參閱文檔 )。 這些是您的隨機子集的限制; 給他們打電話下限上限

復印一份爸爸 對於0:lower和upper + 1:-1(最后一個元素)的子范圍,請按順序用mom的可用元素替換dad_copy的該元素。 您可以使用一個簡單的計數器來跟蹤您在mom中的位置 ,如果該元素已在列表中,則前進:

while mom[i] in dad_copy:
    i += 1

這足以使您進入編碼階段嗎?


操作碼嘗試:

很高興看到您能做到這一點。 您不需要深度拷貝,只需一個普通的完整切片拷貝(請參閱我對該行的更改)。

import random 
dad = [1,2,3,4,5,6,7]
mom = [2,3,6,1,7,5,4]
upper = random.randint(0,len(dad)-1)
lower = random.randint(0,len(dad)-1)
# Note: if lower > upper, you have to switch them.
#    If they're equal, you need to change one.

slice = dad[lower:upper]
child = dad[:]   # Easier way to get a shallow copy

for i in child: 
    if i not in slice:
         i == 0

恐怕您在這里失去了注意力。 您需要逐步瀏覽lower:upper范圍之外的所有位置。 另外,我也不知道你要如何處理i == 0 ; 單純的比較並沒有好處,分配給會破壞您的循環。 繼續努力; 這些是您需要發展的技能。 在您開始這項作業之前,您似乎已經跳過了一些練習。

dad=[1,2,3,4,5,6,7]
mom=[2,3,6,1,7,5,4]
upper=random.randint(0,len(dad)-1)
lower=random.randint(0,len(dad)-1)
slice=dad[lower:upper]
#Find elements from mom only
from_mom = [e for e in mom if e not in slice]
#Append elements from mom to the start and end of the child list.
child = from_mom[0:lower]+slice+from_mom[lower:]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM