生成列表充满了Python中唯一的整数值

问题描述 投票:1回答:3

首先,我想说,我认为完全一样的问题已经回答过了,但短暂的研究之后,我无法找到导致我,我想在这里,这意味着我并没有回答任何线程挖掘不够或漏掉某些关键字。很抱歉,如果这个问题就在那里。

不管怎么说,我已经开始学习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)

但我有一个错误说; “列表索引超出范围”

我预计,如果语句启动的“0”指标和计数,直到“listA的”第九届指数,因为它去,对它们进行比较,如果相同,生成另一个随机数。但很明显,我的指数化是错误的。

此外,在代码的任何其他意见,将不胜感激。

感谢您的时间提前。

python list random unique
3个回答
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)

说明:

让你保持生成数字,直到你想要的名单实际上是10个数字,你应该使用while循环。当循环使用,如果你碰巧产生[2,2,30,40,2,10,20,83,92,29]在随机的,您的列表将只在8号长,因为重复2的不会是补充说,虽然你已经通过你的for循环10次循环。

虽然是这里的关键是,你将永远无法骗过证明预测它会花费多少次随机有10个不同的号码,因此,你要坚持下去,而你还没有达到所需的长度。

此外,在关键字是一个简单的方法来检查,如果里面的东西别的东西已经存在。


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
投票

这可以作为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)
© www.soinside.com 2019 - 2024. All rights reserved.