i am trying to make a character statblock randomizer with a specific setup(because i am a nerd) where it basically “rolls a D6” 4 times and removes the lowest number. however when i try and remove the lowest number from the list, sometimes I get a “IndexError: pop index out of range” issue every 20 or so iterations. what am i doing wrong?
def stat_dice():
four_rolls = []
for _ in range(1,5):
item = random.randint(1,6)
four_rolls.append(item)
min_num = min(four_rolls)
index = four_rolls.index(min_num)
four_rolls.pop(four_rolls[index])
Advertisement
Answer
.pop() takes an item index, not the item to be removed. .remove() takes the item to be removed:
import random
def stat_dice():
# list comprehension to generate die values
rolls = [random.randint(1,6) for _ in range(4)]
print('debug: before removal',rolls)
rolls.remove(min(rolls))
print('debug: after removal',rolls)
return sum(rolls)
print(stat_dice())
Output:
debug: before removal [5, 4, 5, 4] debug: after removal [5, 5, 4] 14
Note in the example above .pop(4) would generate an IndexError because valid indexes are 0-3 for 4-element list. .remove(4) removes the first 4 found in the list.