列表解析中list.pop()的IndexError

时间:2014-04-01 20:16:01

标签: python list-comprehension

学习python我正在实现Bulls and Cows。所以我需要生成一个“随机”数字。我试过这个:

possibilities = range(10)
number = "".join([str(possibilities.pop(random.choice(possibilities))) for i in range(4)])

我认为这是解决问题的一个很好的解决方案,但是在每两次运行中我都会在该行上得到一个IndexError:IndexError: pop index out of range

所以它看起来像random.choice()给了我一个不存在的索引。怎么会? 或者我做出了错误的假设并且问题完全是另外一个问题? 想想看,我还没有得到如何调试这样的语句的线索,关于它的任何指针?

修改
我的第一个解决方案是程序性的:

for i in range(4):
    idx = random.choice(possibilities)
    number = number + str(possibilities[idx])
    del possibilities[idx]

此代码似乎与上面的单行完全相同,但没有任何问题。

1 个答案:

答案 0 :(得分:2)

您不是随机选择索引,而是从列表中选择。如果你从列表中pop下一个或两个较低的数字后选择9,该怎么办?

相反,请使用random.sample

number = "".join(map(str, random.sample(range(10), 4)))