我想从集合中获取随机值。以下是我的代码不起作用。
我收到错误:
文件“/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
答案 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 lineNumber
或if lineNumber > 0
或if lineNumber != 0
(按优先顺序)。eval()
或int()
做得很好时,请勿使用float()
。with
自动关闭文件。