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()関数は以前に読み取られたファイル オブジェクトから読み取るため、セットは空です。

関数定義の一部としてファイルを開いています。つまり、一度しか読み取れません。関数が呼び出されるたびに評価される式に、関数の既定のパラメーターを使用しないでください。「最小の驚き」と可変デフォルト引数を参照してください。

代わりにこれを行います:

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 lineNumberor またはif lineNumber > 0or代わりにテストできますif lineNumber != 0(優先順)。
  • eval()whenint()またはfloat()will do just fine は使用しないでください。
  • withコード ブロックの処理が完了したときにファイルを自動的に閉じるために使用します。
于 2013-09-02T13:51:52.833 に答える