2016-04-05 8 views
0

別の形式にリストのリストを変換しますしようとしてきまし:は、私はこのようになりますリストのリストを持っている

def convert(list): 
    for i in list: 
     return reduce(lambda x,y: objects.filter + '(' + x + ', ' + y + ')' , i) 

map(lambda i: convert(i), names_list)) 
+4

'object.filter'とは何ですか?そしてそれは何を返すのですか? –

+0

@MuhammadTahirはdjangoのorm 'Q'オブジェクトのようですhttps://docs.djangoproject.com/ja/1.9/topics/db/queries/#complex-lookups-with-q-objects –

答えて

2

わずかunderstandinなしaphazardly何かをしようと、「プログラミング偶然」アプローチ(すなわちそしてそれが魔法のように "仕事の種類"であることを望むなら)あなたを遠くに連れて行くことはありません。あなたは何をやっているのか、またその理由を理解するにはが必要です。

最初のポイント:ターゲットはデータではなくPythonの式なので、ソースデータを "別のフォーマットに"変換するのではなく、ソースデータの式を動的に構築(および評価)することです。

2点目:

names_list = [ 
    {"first":'Katie', "last":'Beckett'}, 
    {"first":'David', "last":'Seal'}, 
    {"first":'Eric', "last":'Swartz'} 
    ] 

この:あなたのソースデータフォーマットは単純に間違っている、あなたはlitteral「最初= < ...>」ここに文字列が、非常に明らかにdictsすなわちのリストを望んでいませんつまり、あなたが関数呼び出しで開梱辞書を使用することができます:

target = names_list[0] 
result = object.filter(**target) 

第三のポイント:objects.filter + '(' + x + ', ' + y + ')'は何も意味しない - 機能とうまく動作しません文字列を追加しようとしています。とにかく文字列としてPythonの式を構築しようとしないでください。Pythonは、そのような汚いハックがなければ、問題の種類を解決できるほど表現力豊かでダイナミックです。

あなたがここで望むものは、object.filter()への呼出しのシーケンス(呼び出しの結果)を構築し、2「または」これらの結果を一緒にすることです。

最初のステップは非常に簡単である:

items = [object.filter(**target) for target in names_list] 

第2のステップは、「biwiseまたは」オペレータ(|)を使用して、この配列を「削減」することです。 reduce()は本当にこれにふさわしい機能です。あなたはあなたのアイテムのうちの2つを取り出し、それらを「or'ing」する機能が必要です。単純なアプローチは、ラムダを使用することである。

result = reduce(lambda y, x: x | y, items) 

をこれはPythonのオペレータため車輪の再発明の場合である(良く、それらのほとんど)operatorモジュールに機能バージョンに存在する:

import operator 
result = reduce(operator.or_, items) 
関連する問題