2017-02-19 21 views
1

リストされた辞書の特定のキーの値を置き換えるにはどうすればいいですか?しかし、置換は条件付きで行う必要があります(つまり、最初に2桁の数字がある場合)。リスト/ディクショナリの理解が望ましいPython:リストの辞書、特定の値を置き換えます

例:

a_list = [{'key1': 'A picture 1', 'key2': 'location 1', 'key3': '20 title1'}, {'key1': 'A picture 2', 'key2': 'location 2', 'key3': '10 title2'}] 

私はKEY3の値から最初の2桁を削除したいです。

答えて

1

リストの理解の中で辞書の理解を使ってやります。

辞書内包表記は辞書を再構築しますが、場合には、値を変更:キーは、文字列のkey3

  • 最初の2つの文字である

    変更は右の部分を取っている数字です先頭スペースの

    a_list = [{'key1': 'A picture 1', 'key2': 'location 1', 'key3': '20 title1'}, {'key1': 'A picture 2', 'key2': 'location 2', 'key3': '10 title2'}] 
    
    a_new_list = [{k:v.partition(" ")[2] if (k=="key3" and v[:2].isdigit()) else v for k,v in d.items()} for d in a_list] 
    
    print(a_new_list) 
    

    結果:

    [{'key1': 'A picture 1', 'key2': 'location 1', 'key3': 'title1'}, {'key1': 'A picture 2', 'key2': 'location 2', 'key3': 'title2'}] 
    

    注:2つの以上の数字がある場合にも、最初の数字を削除します。条件は広範囲であり、ニーズに合わせて調整する必要があります。

    EDIT:前のPython 2.7に準拠し、代替(dictの内包表記は時に存在していなかった):

    a_new_list = [dict((k,v.partition(" ")[2] if (k=="key3" and v[:2].isdigit()) else v) for k,v in d.items()) for d in a_list] 
    
  • +0

    それは私が探していたものとまったく同じです。ありがとう。私がre.subでこれをすることができたら私は考えていましたが、いずれにしても自分の必要に応じて適応するつもりです。 – Twilight0

    +0

    これはPython 2.7.Xで動作しますが、Python 2.6.Xで文法エラーが発生しています:( – Twilight0

    +1

    これはdict補完がまだ利用できなかったためです。 –

    1

    あり内包表記でこれを行うための方法であることが、私の意見では、少しをする方が良いかもしれコードの意図をより明確にするために、より詳細な:

    import re 
    
    for d in a_list: 
        for k in d: 
         d[k] = re.sub(r'^\d\d', '', d[k]) if k == 'key3' else d[k] 
    
    0

    をだから私は、ジャン=フランソワ・ファーブルさんとトム・リンチの答えを組み合わせる少し変更された正規表現をパターン化し、これを思い付いた:

    import re 
    
    a_new_list = [{k: re.sub(r'^\d{2} ', '', d[k]) if k == "key3" else v for k, v in d.items()} for d in a_list] 
    
    print a_new_list 
    
    関連する問題