Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 继续减少列表中的值,直到所有值都为0_Python_List_Numpy_Random_While Loop - Fatal编程技术网

Python 继续减少列表中的值,直到所有值都为0

Python 继续减少列表中的值,直到所有值都为0,python,list,numpy,random,while-loop,Python,List,Numpy,Random,While Loop,我有一个名为origin\u list的初始列表。我想随机选取此列表中的一个位置,并将该位置元素的值减少1,直到它们都为0。最快的方法是什么 下面我有一些相当不准确的伪代码来了解我要做的事情 import numpy as np origin_list = [120,240,201] while all(origin_list)>=0: rand_int = np.random.randint(0,len(origin_list)) origin_list[rand_int

我有一个名为
origin\u list
的初始列表。我想随机选取此列表中的一个位置,并将该位置元素的值减少1,直到它们都为0。最快的方法是什么

下面我有一些相当不准确的伪代码来了解我要做的事情

import numpy as np
origin_list = [120,240,201]
while all(origin_list)>=0:
    rand_int = np.random.randint(0,len(origin_list))
    origin_list[rand_int] = origin_list[rand_int]-1
    if origin_list[rand_int]==0:
    # Continue with reducing only the non-zero elements in the list


在这里,您并不真正需要Numpy——因为您明确地希望循环值,所以不会增加太多。您只需获取列表的索引列表,然后使用随机模块选择一个。当该列表为零时,删除索引。当索引列表为空时,停止:

import random

origin_list = [5,4,7]
positions = list(range(len(origin_list)))
                 
while positions:
    p = random.choice(positions)  
 
    # do something
    
    origin_list[p] -= 1 
    if origin_list[p] == 0:
        positions.remove(p)  

print(origin_list)
# [0, 0, 0]    
   

效率可能主要取决于部分
#do something

我稍微修改了伪代码来完成任务

将numpy导入为np
原产地列表=[120240201]
index_list=list(范围(len(origin_list)))#用于跟踪所有剩余索引(origin_list不是0)
而len(索引列表)!=0:
rand_int=np.random.randint(0,len(索引列表))
index=index_list[rand_int]#从数据大于0的剩余索引中选择随机索引
原点列表[索引]=原点列表[索引]-1
#在这里完成你的任务
如果原点列表[索引]==0:
index_list.pop(rand_int)#从可用索引列表中删除该索引
我基本上只是维护可用的索引列表,其中origin\u list的值大于
0


如果源列表中的相关元素达到0,则每个索引将从列表中删除。

我不知道为什么需要这样做。不管怎样,从列表中删除rand_int position是什么意思?如果要在值为0之后删除该值,则while循环的中断条件将是列表长度为0。由于在循环中没有执行任何操作,最快的方法是跳到循环的末尾,并将所有操作都设置为0。@标记我想在循环中执行其他操作。我认为这是我想做的事情的一种方式。@AmitVikramSingh我刚刚编辑了我的问题。如果一个值为零,我希望继续将其他值减为零。您是否打算在循环中使用修改后的
原点列表
?如果它只是决定了你最终将有多少次迭代,那么它就简单到范围内(sum(origin_list))的
for:#dostuff