2017-11-03 4 views
0

私は入力の内容は何ですか?いくつかのフィールドはHTMLエンコードされています。リスト内の辞書のいくつかのフィールドのマップ

[ 
    { 
     CONTENT:"<title>ABC</title>", 
     bla: "Text", 
     x: "<span>Test</span>" 
    }, 
    { 
     CONTENT:"<b>def</b>", 
     bla: "32", 
     x:"<div><b>Test</b></div>" 
    }, 
    ... 
] 

リストfieldsはHTML-ストリッパー_stripを使用して変換するフィールドが含まれています。

fields = ["x", "CONTENT"] 

、この場合CONTENTxに、これらのフィールドの値をマッピングするための最良の方法は何ですかそれぞれ_strip(x)_strip(CONTENT)になります。

私の現在のコードは次のように見ているが、リストとdictsを参照することによって、これがこれを行うにはニシキヘビの方法ではないことを渡されるので、私はいくつかの疑問を持っています。

elements = map(lambda x: f(fields, x), elements) 

def f(fields, element): 
    for field in fields: 
     element[field] = _strip(element[field]) 
    return element 

期待される結果は次のようになります。評価され

[ 
    { 
     CONTENT:_strip("<title>ABC</title>"), 
     bla: "Text", 
     x: _strip("<span>Test</span>") 
    }, 
    { 
     CONTENT:_strip("<b>def</b>"), 
     bla: "32", 
     x:_strip("<div><b>Test</b></div>") 
    }, 
    ... 
] 

[ 
    { 
     CONTENT:"ABC", 
     bla: "Text", 
     x: "Test" 
    }, 
    { 
     CONTENT:"def", 
     bla: "32", 
     x:"Test" 
    }, 
    ... 
] 

私は_strip -functionを要求しませんが、適切な方法のためにマッピングするためにこの。

[{k:(_strip(v) if k in fields else v) for k,v in element.items()} for element in content] 

注これはどちらかそれをワンライナーだが、あなたが合うようにあなたがそれを分割することができますようにPython的ではないこと:ここでは

+0

? – Sebastian

+0

私はそれが一般的に間違っているとは思わないが、私の推測では、参照渡しの場合、入力が変更されるということです。私が間違っているなら、私を訂正してください。マップ関数は関数型プログラミングからのものだと私は考えています。 – ScientiaEtVeritas

+0

変更可能なオブジェクトを関数に渡すことはまったく問題ありません。そうすることができなくても、Pythonで多用することは非常に難しいでしょう。しかし、私はあなたが好きでないと思うのは、あなたがオブジェクトを編集して、変更されたオブジェクトを返すということです。これを修正する方法は、変更された要素 'mod_element = element.copy()'を作成し、そこで値を編集することです。別の答えも入力します。 – Sebastian

答えて

0

はもっぱら内包表記を使用して、所定の位置にelementを編集しない方法です。

関数に参照によってオブジェクトを渡すと間違って何
関連する問題