0

我想从一组中获取一个随机值。以下是我的代码,它不起作用。

我得到错误:

文件“/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
4

1 回答 1

1

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

您正在将文件作为函数定义的一部分打开,这意味着您只能读取一次。不要对每次调用函数时要评估的表达式使用函数默认参数。请参阅“Least Astonishment”和可变默认参数

改为这样做:

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 lineNumberorif lineNumber > 0if lineNumber != 0代替(按优先顺序)。
  • 不要使用eval()whenint()float()will do 就可以了。
  • 用于with在完成代码块时自动关闭文件。
于 2013-09-02T13:51:52.833 回答