2017-09-15 7 views
0

私は辞書オブジェクトを含むリストを持っている:私は何をしたいかリスト内の各アイテムについて同じ更新を適用すると、1レベルのネストされた辞書項目が含まれてい

a = [{'name':'myname', cat:{id:1, link:'xyz'}}, {...}] 

catidを抽出することで、それ自体catに割り当てて、リスト内のすべての辞書の項目のためにこれを繰り返します。私はfor loopを使用してこれを行うことができます知っている

a = [{'name':'myname', new_cat:1}, {...}] 

new_a=[] 
for item in a: 
    x = {'name':item['name'], new_cat:item['cat']['id']} 
    new_a.append(x) 

もっと効率的な方法があるかどうかを知りたかっただけです。例えば、理解度リストを使用する方がこれに対してよりうまくいくでしょうか?

+2

それは正しいPythonの構文のようには見えません。それはjsonの文字列かpythonオブジェクトですか?それはリストですか、それとも辞めですか? –

+0

期待される出力があいまいです。 '' cat''キーの 'dict'値の中で' 'id ''はどうなりますか? –

+0

@ juanpa.arrivillaga 'cat'辞書は' id'の値を保持する変数になります。 – renakre

答えて

1

これは何ですか?

+0

ありがとうございます。 'TypeError:文字列のインデックスは整数でなければならない ' – renakre

+0

@renakreシンプルで完全な例を挙げてください。私はあなたのデータが 'a = [{'name': 'myname'、 'cat':{'id':1、 'link': 'xyz'}}、{...}]'のようなものだと仮定します。しかし、本当に 'cat'、' id'、 'link'はどういう意味ですか?彼らは変数か文字列ですか? – Sraw

+0

私の更新は意味がありますか? a ['name']はその値を完全に返しますが、ループの中で使用すると、 'TypeError:string indices must integers'エラーとなります。 – renakre

1

(それは本当にすべて読みやすく(またはより高速な任意の)リスト-COMP以上ではありませんが)またmaplambdaを使用することができます。

a = [{'name':'myname', 'cat':{'id':1, 'link':'xyz'}},{'name':'yourname', 'cat':{'id':2, 'link':'abc'}}] 

a = map(lambda x: {'name':x['name'],'new_cat':x['cat']['id']}, a) 
print a 

>>> [{'name': 'myname', 'new_cat': 1}, {'name': 'yourname', 'new_cat': 2}] 
関連する問題