【问题标题】:Generating lists filled with unique integer values in Python在 Python 中生成填充有唯一整数值​​的列表
【发布时间】:2019-02-05 13:15:29
【问题描述】:

首先,我想说我认为之前已经回答了完全相同的问题,但是经过简短的研究后,我找不到任何线索可以引导我在这里找到我想要的答案,这意味着我没有挖掘足够或错过了一些关键字。很抱歉,如果这个问题在那里。

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

此外,代码中的任何其他 cmets 将不胜感激。

提前感谢您的宝贵时间。

【问题讨论】:

  • 当列表为空时你正在这样做if listA[i] == listA[i-1]
  • 尝试使用if x in listA:,您可以使用random.sample(range(1, 100), 10)制作唯一列表
  • 您想检查除第一次迭代之外的前一个元素,因此if i>0 and listA[i] == listA[i-1] 将解决您的问题。
  • 谢谢。那很有帮助。就像我说的,因为我对 python 语法真的很陌生,而且我正在通过练习来学习,所以我真的不知道这是可能的。另外,random.sample 对我来说是全新的。

标签: python list random unique


【解决方案1】:

试试下面的。

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 不会已添加,尽管您已经循环了 for 循环 10 次。

虽然是这里的关键,因为您永远无法通过傻瓜证明来预测随机拥有 10 个不同的数字需要多少次,因此您希望继续同时 strong> 你还没有达到所需的长度。

此外,关键字 in 是一种检查某物是否已存在于其他物内的简单方法。

【讨论】:

  • 好答案。我还推荐random.sample 作为while 循环的更好替代方案。
  • 谢谢你,这很有效,你的解释是可以理解的。
  • @jpp 为什么不提供使用random.sample 的单独答案?
  • @Risadinha,因为这在技术上是另一个问题:How do I create a list of random numbers without duplicates?。回答时指出明显和有效的替代方案通常很好,即使它在技术上超出了原始问题。
  • @Risadinha,在我看来,core 问题是 OP 的逻辑在技术上不正确。 other 问题,如何更有效地获得相同的结果,也是一个有效的问题,但不能解释 OP 的误解。
【解决方案2】:

在 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]

【讨论】:

    【解决方案3】:

    这可以被认为是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)
    

    【讨论】:

    猜你喜欢
    • 2018-02-07
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多