我試圖創建一系列作業,并將它們放在一個陣列中。如果我單獨運行這些行,則編碼有效。一個問題是當count等于amountofmachines
它給出錯誤時它不會停止 while 回圈:
IndexError: list assignment index out of range
我對 python 有點新,習慣于 Matlab。我怎樣才能結束這個 while 回圈并使代碼在該行恢復a.sort()?import random import numpy as np from random import randint
MachineNumber = 6 #amount of machines imported from Anylogic
JobNumber = 4 #amount of job sequences
JobSeqList = np.zeros((JobNumber,MachineNumber), dtype=np.int64)
amountofmachines = randint(1, MachineNumber) #dictated how much machines the order goes through
a = [0]*amountofmachines #initialize array of machines sequence
count = 0 #initialize array list of machines
element = [n for n in range(1, MachineNumber 1)]
while count <= amountofmachines:
a[count] = random.choice(element)
element.remove(a[count])
count = count 1
a.sort() #sorts the randomized sequence
A = np.asarray(a) #make an array of the list
A = np.pad(A, (0,MachineNumber-len(a)), 'constant') #adds zeros to the end of sequence
#add the sequence to the array of all sequences
JobSeqList[0,:] = A[:]
uj5u.com熱心網友回復:
我已經測驗了您的代碼,并找到了答案!
Matlab 索引從 1 開始,因此串列中的第一項將在 1..
但是,python 索引從 0 開始,因此串列中的第一項將在 0...
改變這一行:
while count <= amountofmachines
成為:
while count < amountofmachines
更新代碼:
import random
import numpy as np
from random import randint
MachineNumber = 6 #amount of machines imported from Anylogic
JobNumber = 4 #amount of job sequences
JobSeqList = np.zeros((JobNumber,MachineNumber), dtype=np.int64)
amountofmachines = randint(1, MachineNumber) #dictated how much machines the order goes through
a = [0]*amountofmachines #initialize array of machines sequence
count = 0 #initialize array list of machines
element = [n for n in range(1, MachineNumber 1)]
while count < amountofmachines:
a[count] = random.choice(element)
element.remove(a[count])
count = count 1
a.sort() #sorts the randomized sequence
A = np.asarray(a) #make an array of the list
A = np.pad(A, (0,MachineNumber-len(a)), 'constant') #adds zeros to the end of sequence
#add the sequence to the array of all sequences
JobSeqList[0,:] = A[:]
uj5u.com熱心網友回復:
while使用<vs的回圈問題<=已經得到解答,但我想更進一步,并建議以這種方式構建串列(通過手動遞增或遞減計數器)是 Python 中幾乎從未做過的事情首先,希望為您提供更多“pythonic”工具將幫助您避免將來在習慣 Python 時遇到類似的絆腳石。Python 擁有非常出色的工具,可用于迭代和構建資料結構,通過將所有“繁忙的作業”從您的肩上卸下,可以消除很多出現此類小錯誤的機會。
所有這些代碼:
a = [0]*amountofmachines #initialize array of machines sequence
count = 0 #initialize array list of machines
element = [n for n in range(1, MachineNumber 1)]
while count < amountofmachines:
a[count] = random.choice(element)
element.remove(a[count])
count = count 1
a.sort() #sorts the randomized sequence
相當于“構建一個amountofmachines從range(1, MachineNumber 1)“中提取的唯一數字的排序陣列”,可以使用random.sample和更簡單地表示sorted:
a = sorted(random.sample(range(1, MachineNumber 1), amountofmachines))
請注意,a = sorted(a)這與a.sort()--sorted進行排序并將結果作為串列回傳,而sort在現有串列上進行就地排序相同。在上面的代碼行中,random.sample回傳從范圍中獲取的隨機元素串列,并sorted回傳該串列的排序版本,然后將其分配給a。
如果random.sample不存在,您可以使用random.shuffle和串列切片。這是將一副牌(element)洗牌,然后amountofmachines在重新分類之前將牌從頂部取下:
element = [n for n in range(1, MachineNumber 1)]
random.shuffle(element)
a = sorted(element[:amountofmachines])
如果這兩者都不存在并且您不得不使用random.choice一個一個地選擇元素,那么還有更簡單的方法來通過迭代構建串列;無需靜態預分配串列,也無需使用您自己管理的計數器跟蹤您的迭代,因為for這樣做適合您:
a = []
element = [n for n in range(1, MachineNumber 1)]
for i in range(amountofmachines):
a.append(random.choice(element))
element.remove(a[i])
a.sort()
為了使它更簡單,甚至沒有必要讓for回圈i為您跟蹤,因為您可以使用以下命令訪問串列中的最后一項[-1]:
a = []
element = [n for n in range(1, MachineNumber 1)]
for _ in range(amountofmachines):
a.append(random.choice(element))
element.remove(a[-1])
a.sort()
為了使它更簡單,您可以使用pop()代替remove():
a = []
element = [n for n in range(1, MachineNumber 1)]
for _ in range(amountofmachines):
a.append(element.pop(random.choice(range(len(element)))))
a.sort()
這也可以表示為串列理解:
element = [n for n in range(1, MachineNumber 1)]
a = [
element.pop(random.choice(range(len(element))))
for _ in range(amountofmachines)
]
a.sort()
或作為生成器運算式作為引數傳遞給sorted:
element = [n for n in range(1, MachineNumber 1)]
a = sorted(
element.pop(random.choice(range(len(element))))
for _ in range(amountofmachines)
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/383221.html
下一篇:Numpy意味著無法獲得其他軸
