如何结束带有 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 循环使用&lt;&lt;= 的问题已经得到解答,但我想更进一步,建议以这种方式构建一个列表(通过增加一个计数器)或手动递减)是一开始在 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.samplesorted表示:

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 循环?的主要内容,如果未能解决你的问题,请参考以下文章

while循环和for循环

js中for循环和while循环在使用的时候有何区别?

while循环的条件?

如何选用forwhiledo while循环

for与while循环break跳出循环continue结束本次循环exit退出脚本

DAY 04 while和for循环