【问题标题】:Error in Python with for loop being out of rangePython 中的错误,for 循环超出范围
【发布时间】:2015-01-26 04:00:18
【问题描述】:

我正在用 PsychoPy(一种用于使用 Python 进行心理学实验的软件)编写程序,并且不断收到“列表索引超出范围”错误。问题出现在“if already_used_values[a] == value:”的行上。我可以看到为什么会发生这种情况的唯一可能原因是因为 already_used_values 开始时是一个空列表;但是,我认为如果列表为空,我通过说 return False 解决了这个问题。以下是相关代码供参考。

already_used_values = []#integers in order to sort sounds
sorted_sounds = []#note that these are not 'sorted', they are randomized each time
answer_key = []
def already_used(value):#returns true if value in array of sounds has been used
    if len(already_used_values) == 0:
        return False
    for a in already_used_values:
        if already_used_values[a] == value:
            return True
    return False
def pick_random_value(upLim):
    return random.randint(0,upLim-1)

def pick_sound(sound_list):#picks a sound randomly from list_of_sounds 
    new_value = pick_random_value(len(sound_list))
    while(already_used(new_value)):
        new_value = pick_random_value(len(sound_list))
    already_used_values.append(new_value)
    return sound_list[new_value]

def init_sorted_sounds():#appends random sound from list_of_sounds to sorted_sounds
    for i in list_of_sounds:
        sorted_sounds.append(pick_sound(list_of_sounds))
    answer_key = already_used_values

提前谢谢你!

【问题讨论】:

标签: python loops psychopy


【解决方案1】:

这对线:

for a in already_used_values:
    if already_used_values[a] == value:

是您报告的错误的根源。当您说for a in something 时,变量a 采用something 元素的每个,而不是每个索引。然而,在下一行中,您使用a 作为索引。例如,如果already_used_values 等于[ 5, 6 ],在第一次迭代中a 取值5,随后的行尝试检查already_used_values[ 5 ],这显然超出了2 元素列表的范围。

很难准确说出意图,但看起来您的函数 already_used 可以简化为单个布尔值表达式 new_value in already_used_values

所以这条线

while(already_used(new_value)):

变成

while( new_value in already_used_values ):

我们摆脱了这个功能。但是,让我们更进一步并认识到,您可以从 已经 排除之前使用的值的池中随机选择元素,而不是您当前拥有的反复试验的 while 循环你执行挑选:

remaining_choices = [ x for x in sound_list if x not in already_used_values ]
new_value = random.choice( remaining_choices  )
already_used_values.append( new_value )

这样就摆脱了 while 循环。但我们甚至可以进一步优化一步,如下面的chthonicdaemon 所指出的。看起来,最终,您对所有这些代码的目标只是找到一个列表的随机重新排序。这可以用一两行来完成:

sorted_sounds = list( list_of_sounds )  # make a copy of the original list of sounds
random.shuffle( sorted_sounds )  # randomly reorder the new list in place

【讨论】:

  • 如果您的目标只是构建声音的随机排列,您可以走得更远:sorted_sounds = range(len(list_of_sounds)); random.shuffle(sorted_sounds)
猜你喜欢
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 2017-04-27
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2013-03-09
相关资源
最近更新 更多