首先,我想说的是我之前曾回答过完全相同的问题,但是经过简短的研究,我找不到任何线索可以将我引向我想要的答案,这意味着我没有充分挖掘或错过了一些关键字。对不起,如果那个问题在那里。
无论如何,我已经开始学习python并正在进行一些练习。我需要创建一个包含10个随机生成的整数的列表,每个整数必须具有不同的值。
因此,我尝试将列表的第一个元素与下一个元素进行比较,如果它们相同,则尝试使用if语句生成一个新数字。
import random
listA = []
for i in range(0,10):
x=random.randint(1,100)
if listA[i] == listA[i-1]:
x=random.randint(1,100)
else:
listA.append(x)
listA.sort()
print(listA)
但是我有一个错误的说法: “列表索引超出范围”
我希望if语句以“ 0”索引开头,一直计数到“ listA”的第9个索引,然后将它们进行比较,如果相同,则生成另一个随机数。但是很明显,我的索引是错误的。
此外,对代码的任何其他注释也将不胜感激。
感谢您的时间。
答案 0 :(得分:3)
尝试以下方法。
import random
listA = []
while(len(listA) < 10):
x = random.randint(1,100)
if x not in listA:
listA.append(x)
listA.sort()
print(listA)
说明:
您应该使用while循环,以便继续生成数字,直到所需的列表实际上是10个数字为止。使用for循环时,如果您偶然随机生成[2,2,30,40,2,10,20,83,92,29],则列表将只有8个数字,因为重复的2不会已添加,尽管您已经遍历了10次for循环。
而是这里的关键,因为您将无法愚蠢地预测随机拥有10个不同数字所需要的次数,因此,您希望在的同时继续 strong>您尚未达到所需的长度。
此外,关键字 in 是检查其他内容中是否已经存在其他内容的简单方法。
答案 1 :(得分:3)
在Python中,set
只能包含唯一值,因此在以下代码中,重复的随机数不会增加集合的长度:
import random
s = set()
while len(s) < 10:
s.add(random.randint(1,100))
print(sorted(s))
输出:
[18, 20, 26, 48, 51, 72, 75, 92, 94, 99]
答案 2 :(得分:2)
这可以被认为是sampling without replacement。在这种情况下,您从range(1, 101)
中随机“采样”了10个项目,而每个被采样的项目只能采样一次(即不能“替换”-想象从袋子中随机抽取编号的球以了解情况)概念)。
无需替换即可进行采样:
import random
listA = random.sample(range(1, 101), 10)
另一种思考方式是改组list(range(1, 101))
并采用前10个元素:
import random
listA = list(range(1, 101))
random.shuffle(listA)
listA[:10]
选择不同的方法
使用%timeit
magic in iPython,我们可以比较答案中建议的不同方法:
def random_sample():
import random
return sorted(random.sample(range(1, 101), 10))
def random_shuffle():
import random
listA = list(range(1, 101))
random.shuffle(listA)
return sorted(listA[:10])
def while_loop():
import random
listA = []
while(len(listA) < 10):
x = random.randint(1, 100)
if x not in listA:
listA.append(x)
return sorted(listA)
def random_set():
import random
s = set()
while len(s) < 10:
s.add(random.randint(1, 100))
return sorted(s)
%timeit for i in range(100): random_sample()
# 1.38 ms ± 17.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit for i in range(100): random_shuffle()
# 6.81 ms ± 104 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit for i in range(100): while_loop()
# 1.61 ms ± 18.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit for i in range(100): set_approach()
# 1.48 ms ± 19.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)