2017-01-30 4 views
-3

単純なカットアップメソッド(Wikipedia)をPythonで実行しようとしていますが、 。ここで私が持っているものです:Cut-upメソッドスクリプト - TypeError: 'generator'タイプのオブジェクトにlen()がありません

import random 

def splitter(string, num): 
    pieces = string.split() 

    for i in xrange(0, len(pieces), num): 
     yield' '.join(pieces[i:i+num]) 

def cutup(what, order): 
    mixed = list(random.shuffle(splitter(what, order))) 
    for piece in mixed: 
     print piece + " " 

cutup(range(1,100), 3) 

アイデアは、言葉のnum -lengthedチャンクに入力を分割し、それらのチャンクをシャッフル、バックそれらを一緒にスプライスし、それらをバック吐き出すことです。しかし、私はこのエラーを取得しておいてください。

Traceback (most recent call last): 
    File "cutup.py", line 15, in <module> 
    cutup(range(1,100), 3) 
    File "cutup.py", line 11, in cutup 
    mixed = list(random.shuffle(splitter(what, order))) 
    File "/usr/lib/python2.7/random.py", line 288, in shuffle 
    for i in reversed(xrange(1, len(x))): 
TypeError: object of type 'generator' has no len() 

私はそれがrandom.shuffle()が発電を返すとは何かを持っていると思いますか?私はそれを修正するように見えることはできません。何かご意見は?

答えて

0

random.shuffle()は、入力がどのくらいの長さであるかを知る必要があります(オブジェクトの長さを取得しようとします)。発電機は、これを提供することはできませんし、リストにそれを具現化する必要があります。

lst = list(yielding(x)) 
random.shuffle(lst) 

また、ノート、random.shuffleは、インプレースリストの変更を行います。 ドキュメントはhereです。

+0

私は、この混乱しているジェネレータのすべてをかわすことにし、O(NlogN)オプションを使用することに決めました: 'ソートされた(スプリッタ(何、オーダー)、キー=ラムダk:ランダム。 'random'(' random.sample() ')のようなO(N)オプションがありますか?私はそれを繰り返すことを心配しています... – aparsnips

+0

この答えはあなたにo(n)オプションを与えますか? – njzk2

+0

ああ、今日私はばかなようです – aparsnips

関連する問題