2017-12-21 11 views
0

max関数とそのkey引数を使用して、実際のムービータイトルが与えられた場合、おおよそのムービータイトルに最も近いものを見つけようとしています。 私は、サンプルリストを定義し、それが動作する機能をテスト...TypeError: 'float'オブジェクトは、組み込みのmax関数のリストでは反復できません。

from difflib import SequenceMatcher as SM 
movies = ['fake movie title', 'faker movie title', 'shaun died'] 
approx_title = 'Shaun of the Dead.' 
max(movies, key = lambda title: SM(None, approx_title, title).ratio()) 
'shaun died' 

しかし、私は別のデータフレームで列全体に一致しようとしていますので、私はリストと、実行中にそのパンダシリーズを変換しようとした場合私は両方のムービーのデータ型をチェックしていますが、同じ関数ですが、代わりにtype_errorを取得します& movie_lstはリストです。

Old id New id Title Year Critics Score Audience Score Rating 
NaN  21736.0 Peter Pan 1999.0 NaN 70.0 PG nothing objectionable 
NaN  771471359.0 Dragonheart Battle for the Heartfire 2017.0 NaN 50.0 PG13 
NaN  770725090.0 The Nude Vampire Vampire nue, La 1974.0 NaN 24.0 NR 
2281.0 19887.0 Beyond the Clouds 1995.0 65.0 67.0 NR 
10913.0 11286.0 Wild America 1997.0 27.0 59.0 PG violence 

movie_lst = rt_info['Title'].tolist() 
['Peter Pan', 
'Dragonheart Battle for the Heartfire', 
'The Nude Vampire Vampire nue, La', 
'Beyond the Clouds', 
'Wild America', 
'Sexual Dependency', 
'Body Slam', 
'Hatchet II', 
'Lion of the Desert Omar Mukhtar', 
'Imagine That', 
'Harold', 
'A United Kingdom', 
'Violent City The FamilyCitt violenta', 
'Ratchet Clank', 
'Wes Craven Presents Carnival of Souls', 
'The Adventures of Ociee Nash', 
'Blackfish', 
'For Petes Sake', 
'Daybreakers', 
'The Big One', 
'Godzilla vs Megaguirus', 
'In a Lonely Place', 
'Case 39', ... 
] 

max(movie_lst, key = lambda title: SM(None, approx_title, title).ratio()) 

TypeError         Traceback (most recent call last) 
<ipython-input-88-0022a3c1bdb9> in <module>() 
----> 1 max(movie_lst, key = lambda title: SM(None, approx_title, title).ratio()) 

<ipython-input-88-0022a3c1bdb9> in <lambda>(title) 
----> 1 max(movie_lst, key = lambda title: SM(None, approx_title, title).ratio()) 

/usr/lib/python3.4/difflib.py in __init__(self, isjunk, a, b, autojunk) 
    211   self.a = self.b = None 
    212   self.autojunk = autojunk 
--> 213   self.set_seqs(a, b) 
    214 
    215  def set_seqs(self, a, b): 

/usr/lib/python3.4/difflib.py in set_seqs(self, a, b) 
    223 
    224   self.set_seq1(a) 
--> 225   self.set_seq2(b) 
    226 
    227  def set_seq1(self, a): 

/usr/lib/python3.4/difflib.py in set_seq2(self, b) 
    277   self.matching_blocks = self.opcodes = None 
    278   self.fullbcount = None 
--> 279   self.__chain_b() 
    280 
    281  # For each element x in b, set b2j[x] to a list of the indices in 

/usr/lib/python3.4/difflib.py in __chain_b(self) 
    309   self.b2j = b2j = {} 
    310 
--> 311   for i, elt in enumerate(b): 
    312    indices = b2j.setdefault(elt, []) 
    313    indices.append(i) 

TypeError: 'float' object is not iterable 

私はなぜ - すべての助けに感謝します!

+0

あなたは 'movie_lst'を印刷しようとしている:あなたは、印刷によって犯罪者を見つけることができます

ノート?あなたは1列離れていて、文字の代わりに浮動小数点数を反復している可能性が非常に高いです。 –

+0

はい、movie_lstの外観を表示するために質問を更新しました。 – Matt

+0

野生の推測:フロートのような名前の映画はありませんか?私は11.6と呼ばれるフランス語を知っています。パンダはそれを自動的にフロートに変換しませんか? –

答えて

1

パンダのエキスパートではなく、再生方法にもよりますが、フロートに一致するタイトル(フランス語の映画11.6など)があるため、文字列ではなくfloatですよくあなたの問題は、それは):)可能であることを証明している

良い回避策は、次のように文字列としてデータを強制的に次のようになります。彼らはすでにある場合には、文字列のコピーを作成しません

movie_lst = [str(x) for x in movie_lst] 

文字列(Should I avoid converting to a string if a value is already a string?)ので効率的で、文字列だけを取得することができます。

[x for x in movie_lst if not isinstance(x,str)] 
関連する問題