如何结束带有 for 循环的 while 循环?
Posted
技术标签:
【中文标题】如何结束带有 for 循环的 while 循环?【英文标题】:How do I end a while loop with a for loop in it? 【发布时间】:2022-01-19 17:01:50 【问题描述】:我正在尝试创建一系列作业,并将它们放入一个数组中。
如果我单独运行这些行,编码就可以工作。一个问题是当count
等于amountofmachines
时它不会停止while 循环
它给出了错误:
IndexError: list assignment index out of range
我对 python 有点陌生,习惯于 Matlab。我怎样才能结束这个while循环并使代码在a.sort()
行恢复?
随机导入
将 numpy 导入为 np
从随机导入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[:]
【问题讨论】:
请正确缩进代码 【参考方案1】:您的while
循环使用<
与<=
的问题已经得到解答,但我想更进一步,建议以这种方式构建一个列表(通过增加一个计数器)或手动递减)是一开始在 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)
)
【讨论】:
这太棒了!谢谢!我真的需要缩小我的 Matlab 大脑。刚开始使用Python两天,这些功能很神奇。谢谢!【参考方案2】:我测试了你的代码,找到了答案!
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[:]
【讨论】:
以上是关于如何结束带有 for 循环的 while 循环?的主要内容,如果未能解决你的问题,请参考以下文章