在Python中生成填充有唯一整数值​​的列表

时间:2019-02-05 13:15:29

标签: python list random unique

首先,我想说的是我之前曾回答过完全相同的问题,但是经过简短的研究,我找不到任何线索可以将我引向我想要的答案,这意味着我没有充分挖掘或错过了一些关键字。对不起,如果那个问题在那里。

无论如何,我已经开始学习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个索引,然后将它们进行比较,如果相同,则生成另一个随机数。但是很明显,我的索引是错误的。

此外,对代码的任何其他注释也将不胜感激。

感谢您的时间。

3 个答案:

答案 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)