【问题标题】:How to remove duplicate number within a list and then replace with a new random number如何删除列表中的重复数字,然后用新的随机数替换
【发布时间】:2019-08-30 05:01:43
【问题描述】:

python 新手。我正在尝试制作一个彩票风格的东西,其中 for 循环将 5 随机数附加到一个列表中。

假设到目前为止的列表是nList = [1,2,3,4],而最后一次迭代恰好也是4

我希望代码删除应该在最后一个索引中的额外4,并将其替换为一个全新的随机数,该随机数不会重复列表中的任何其余数字。我似乎无法理解它。

我试过nList.pop(),解决了删除重复的问题,只是不知道怎么添加新的随机数。

import random
nList = []
random.seed()
for x in range(5):
    n = random.randint(1,39)
    for item in nList:
       if n == item:
            nList.pop()
    else:
        nList.append(n)

print(nList)

我只是得到了一个较小的列表,这不是我想要的。

【问题讨论】:

  • 如果n 已经在列表中,则将其删除并重新添加。这意味着在此循环迭代中没有添加新项目。解决方案:将外部for循环替换为while循环测试nList的长度。

标签: python loops random numbers generator


【解决方案1】:

您可以使用set 而不是使用list,它具有没有重复项的特殊属性。这个想法是,如果你生成一个已经在set 中的数字,你只需重新滚动直到你得到一个不在set 中的数字。通过使用集合,您还具有O(1) 查找时间的优势。

import random

nList = set()
for x in range(5):
    n = random.randint(1,39)
    while n in nList:
        n = random.randint(1,39)
    nList.add(n)

print(list(nList))

示例输出

[24、25、11、12、15]

【讨论】:

  • 很好的答案和解释。 +1!但是有一个捷径:import random print(random.sample(range(1,39),5))
  • 很有趣,不知道random 模块有一个内置函数可以做到这一点
【解决方案2】:

实际上你可以用一种更简单的方式来做到这一点,直接从random 模块执行此操作(无需费力地重新发明轮子——除了学习目的):

import random
print(random.sample(range(1,39),5))

输出示例:

[29, 20, 26, 17, 37]

说明:

  • range(1,39) 生成您需要的范围(即您的初始人口)
  • random.sample() 返回从种群序列中选择的唯一元素的 k 长度列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-01
    • 2021-06-17
    • 2015-06-02
    • 2016-03-08
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 2020-11-25
    相关资源
    最近更新 更多