从Set python中获取随机值

时间:2013-09-02 13:47:30

标签: python random set

我想从集合中获取随机值。以下是我的代码不起作用。

我收到错误:

  

文件“/usr/lib/python2.7/random.py”,第320行,样本中               提出ValueError(“样本大于人口”)       ValueError:大于人口的样本

我不知道这意味着什么。我想得到一个整数,所以我可以将这个整数添加到一个集合中。所以我从一组中随机选择了N个元素放入另一组。

def getRandomBook():
    bookset = getBookSet()
    random_number = random.sample(bookset,1)
    print random_number[0]
    return_number = random_number[0]
    return return_number


def getBookSet(sales_input=open("data/sales_3yr.csv", "r")):
    sales = csv.reader(sales_input)
    bookID = set()
    lineNumber = 0    
    for line in sales:
        id = line[6]
        if lineNumber<>0:
            bookID.add(eval(id))
        lineNumber=1
    return bookID

1 个答案:

答案 0 :(得分:1)

这意味着你的集合是空的,并且集合是空的,因为你的getBookSet()函数将从之前已经读过的文件对象中读取。

您正在打开文件作为定义功能的一部分,这意味着您只能阅读一次。每次调用函数时,不要对要评估的表达式使用函数默认参数。请参阅"Least Astonishment" and the Mutable Default Argument

请改为:

def getBookSet(sales_input="data/sales_3yr.csv"):
    sales = csv.reader(open(sales_input, 'rb'))
    bookID = set()
    lineNumber = 0    
    for line in sales:
        id = line[6]
        if lineNumber<>0:
            bookID.add(eval(id))
        lineNumber=1
    return bookID

现在,每次调用函数时,函数都会打开文件对象,并再次从第一个字节开始读取。 sales_input参数现在是一个不可变的字符串,用于在运行函数时打开文件对象,而不是在定义函数时。

纠正其他一些问题:

def getBookSet(sales_input="data/sales_3yr.csv"):
    with open(sales_input, 'rb') as sales_file:
        sales = csv.reader(sales_file)
        next(sales, None)  # skip the first line
        return {int(row[6]) for row in sales}
  • next()来电将为我们(标题)提取第一行,sales的任何进一步循环将从下一行继续。
  • 不要使用<>;它已被弃用。您可以测试if lineNumberif lineNumber > 0if lineNumber != 0(按优先顺序)。
  • eval()int()做得很好时,请勿使用float()
  • 完成代码块后,使用with自动关闭文件。