回答:
すべての辞書にvalue
キーがあると仮定すると、次のように書くことができます(リストの名前がであると仮定l
)
[d['value'] for d in l]
value
不足している可能性がある場合は、使用できます
[d['value'] for d in l if 'value' in d]
map()およびラムダ関数を使用してこれを行う別の方法を次に示します。
>>> map(lambda d: d['value'], l)
ここで、lはリストです。私はこの方法を「最もセクシー」に見ていますが、リスト内包表記を使用してそれを行います。
更新: 'value'がキーとして使用できない場合:
>>> map(lambda d: d.get('value', 'default value'), l)
更新:私もラムダの大ファンではありません、名前を付けるのが好きです...これを念頭に置いてそれを行う方法を次に示します。
>>> import operator
>>> map(operator.itemgetter('value'), l)
私はさらに進んで、私が達成したいことを明示的に示す単一の関数を作成します:
>>> import operator, functools
>>> get_values = functools.partial(map, operator.itemgetter('value'))
>>> get_values(l)
... [<list of values>]
Python 3ではmap
、イテレータを返すため、を使用list
してリストを返しlist(map(operator.itemgetter('value'), l))
ます。
map
を使用する場合はoperator.itemgetter('value')
、ではなくを使用してくださいlambda
。
[x['value'] for x in list_of_dicts]
getkey
ませんd.get('value')
。これは、Michalではなく、@ isbadawiの2番目のリスト内包表記と同じです。
このような非常に単純なケースの場合、Ismail Badawiの回答にあるような理解度は間違いなく進むべき道です。
しかし、状況がさらに複雑になり、複雑な式を含む複数句またはネストされた内包表記を書き始める必要がある場合は、他の代替手段を検討する価値があります。JSONPath、DPath、KVCなど、ネストされたdict-and-list構造でXPathスタイルの検索を指定するには、いくつかの異なる(準)標準的な方法があります。そして、それらのためのPyPI上の素晴らしいライブラリがあります。
以下は、という名前のライブラリを使用した例で、dpath
少し複雑なものを簡略化する方法を示しています。
>>> dd = {
... 'fruits': [{'value': 'apple', 'blah': 2}, {'value': 'banana', 'blah': 3}],
... 'vehicles': [{'value': 'cars', 'blah':4}]}
>>> {key: [{'value': d['value']} for d in value] for key, value in dd.items()}
{'fruits': [{'value': 'apple'}, {'value': 'banana'}],
'vehicles': [{'value': 'cars'}]}
>>> dpath.util.search(dd, '*/*/value')
{'fruits': [{'value': 'apple'}, {'value': 'banana'}],
'vehicles': [{'value': 'cars'}]}
または、次を使用しjsonpath-ng
ます:
>>> [d['value'] for key, value in dd.items() for d in value]
['apple', 'banana', 'cars']
>>> [m.value for m in jsonpath_ng.parse('*.[*].value').find(dd)]
['apple', 'banana', 'cars']
これは一見するとそれほど単純に見えないかもしれません。なぜならfind
、各項目への直接パスなど、一致した値だけでなくあらゆる種類のものが含まれる一致オブジェクトを返すからです。しかし、より複雑な式の'*.[*].value'
場合、それぞれに内包句の代わりにパスを指定*
できると、大きな違いが生じる可能性があります。さらに、JSONPathは言語に依存しない仕様であり、デバッグに非常に便利なオンラインテスターさえあります。
以下のように単純なものがあなたが探しているものを与えると思います。
In[5]: ll = [{'value': 'apple', 'blah': 2}, {'value': 'banana', 'blah': 3} , {'value': 'cars', 'blah':4}]
In[6]: ld = [d.get('value', None) for d in ll]
In[7]: ld
Out[7]: ['apple', 'banana', 'cars']
あなたは、の組み合わせでこれを行うことができますmap
し、lambda
同様が、よりエレガントで神託リスト内包のルックス。
入力リストが小さい場合は理解が進む方法ですが、入力が本当に大きい場合は、ジェネレーターが理想的な方法だと思います。
In[11]: gd = (d.get('value', None) for d in ll)
In[12]: gd
Out[12]: <generator object <genexpr> at 0x7f5774568b10>
In[13]: '-'.join(gd)
Out[13]: 'apple-banana-cars'
これは、より大きな入力に対するすべての可能な解決策の比較です
In[2]: l = [{'value': 'apple', 'blah': 2}, {'value': 'banana', 'blah': 3} , {'value': 'cars', 'blah':4}] * 9000000
In[3]: def gen_version():
...: for i in l:
...: yield i.get('value', None)
...:
In[4]: def list_comp_verison():
...: return [i.get('value', None) for i in l]
...:
In[5]: def list_verison():
...: ll = []
...: for i in l:
...: ll.append(i.get('value', None))
...: return ll
In[10]: def map_lambda_version():
...: m = map(lambda i:i.get('value', None), l)
...: return m
...:
In[11]: %timeit gen_version()
172 ns ± 0.393 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In[12]: %timeit map_lambda_version()
203 ns ± 2.31 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In[13]: %timeit list_comp_verison()
1.61 s ± 20.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In[14]: %timeit list_verison()
2.29 s ± 4.58 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
ご覧のとおり、ジェネレーターは他のジェネレーターに比べて優れたソリューションです。マップもジェネレーターに比べて遅いため、OPに任せて計算します。
例に従ってください-
songs = [
{"title": "happy birthday", "playcount": 4},
{"title": "AC/DC", "playcount": 2},
{"title": "Billie Jean", "playcount": 6},
{"title": "Human Touch", "playcount": 3}
]
print("===========================")
print(f'Songs --> {songs} \n')
title = list(map(lambda x : x['title'], songs))
print(f'Print Title --> {title}')
playcount = list(map(lambda x : x['playcount'], songs))
print(f'Print Playcount --> {playcount}')
print (f'Print Sorted playcount --> {sorted(playcount)}')
# Aliter -
print(sorted(list(map(lambda x: x['playcount'],songs))))
Pythonの辞書のリストからキー値を取得しますか?
例:
data =
[{'obj1':[{'cpu_percentage':'15%','ram':3,'memory_percentage':'66%'}]},
{'obj2': [{'cpu_percentage':'0','ram':4,'memory_percentage':'35%'}]}]
データのdの場合:
for key,value in d.items():
z ={key: {'cpu_percentage': d['cpu_percentage'],'memory_percentage': d['memory_percentage']} for d in value}
print(z)
出力:
{'obj1': {'cpu_percentage': '15%', 'memory_percentage': '66%'}}
{'obj2': {'cpu_percentage': '0', 'memory_percentage': '35%'}}