【问题标题】:Python: Preventing elements being appended to the same list over and overPython:防止元素被一遍又一遍地附加到同一个列表中
【发布时间】:2013-09-10 11:31:30
【问题描述】:

我正在做我的第一个 OOP 项目,它是一个随机数生成器,可以生成给定范围内的多个随机数:

import random
import math

resList=[]

class randomInRange:
    def getRandom(self, start, end, quantity):
        for i in range(quantity):
            selList = range(start, end)
            resNum = random.choice(selList)
            resList.append(resNum)

        return (resList)

RR=randomInRange()

然后,我会在 Python Shell 中输入:

    (RR.getRandom(0,10,10))

它会给出这样的结果:[2, 2, 1, 4, 8, 1, 0, 7, 4, 5] 但是如果我再次调用该函数,它将附加新生成的 号码到同一个列表。所以它会是这样的: [2, 2, 1, 4, 8, 1, 0, 7, 4, 5, 4, 5, 3, 1, 8, 6, 7, 5, 4, 4]

我该如何解决这个问题?如何防止新数据一遍又一遍地附加到同一个列表中,这使得列表无用?

提前致谢!

【问题讨论】:

  • 使其成为一个集合 - 值必须是唯一的。或者在插入之前检查值是否出现。
  • 我有点需要了解集合 :/ 我刚开始使用 python :) 谢谢你的帮助 :)
  • @duffymo 这不是问题:p
  • @user2754106 在official python docs 上有一个很好的教程:)
  • @ Haidro 感谢您的提醒! :) 会尽快检查出来 :)

标签: python list class oop append


【解决方案1】:

这是因为resList 是一个全局变量,在调用randomInRange 时您永远不会擦除它的内容。您应该只在函数中创建列表:

class randomInRange:
    def getRandom(self, start, end, quantity):
        resList = []
        for i in range(quantity):
            selList = range(start, end)
            resNum = random.choice(selList)
            resList.append(resNum)
        return (resList)

请注意,您的函数也可以替换为列表推导:

def getRandom(self, start, end, quantity):
    temp = range(start, end)
    return [random.choice(temp) for _ in range(quantity)]

【讨论】:

  • 天哪,我不知道我怎么想不到这一点,耶稣:谢谢,先生! :D
  • @user2754106 不客气!有空的时候别忘了accept an answer
  • @duffymo 谢谢:)!
【解决方案2】:
import random
import math

resList=[]

class randomInRange:
    def getRandom(self, start, end, quantity):
        for i in range(quantity):
            selList = range(start, end)
            resNum = random.choice(selList)
        if resNum not in resList:
                resList.append(resNum) 

        return (resList)

RR=randomInRange()
print RR.getRandom(0,10,10)

【讨论】:

  • 这是不对的。 print RR.getRandom(0,10,10) 再次。又一次……又一次;)。你会看到:)
  • 这就是我问别人的原因 :D 并得到了一个很好的答案,感谢您的支持!
【解决方案3】:

或者更简单的方法如下

import random

def getRandom(start, end, quantity):
    return [random.choice(range(start, end)) for _ in range(quantity)]

print getRandom(0, 10, 10)

【讨论】:

  • 嗯。这确实紧凑而简单,感谢您的回答:)
猜你喜欢
  • 2011-10-30
  • 2019-07-05
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-21
  • 2016-12-20
相关资源
最近更新 更多