簡単にするために、私は2つのリストをリストに入れましたが、実際にリストの100のリストを扱っています。私はそのリストの中の他の辞書をチェックすることなく(それらがすべてそのキーで同じ値を含んでいることを知っているので)第1の辞書の 'status'キーの値を得たいだけです。それから私は大きな辞書の中である種のクラスタリングを行います。私はすべての 'タイトル'の値を効率的に連結する必要があります。私のコードをもっとエレガントでもっと速くする方法はありますか?辞書のリストがもっと速く、もっと「平凡」である
私が持っている:
はnested = [
[
{'id': 287, 'title': 'hungry badger', 'status': 'High'},
{'id': 437, 'title': 'roadtrip to Kansas','status': 'High'}
],
[
{'id': 456, 'title': 'happy title here','status': 'Medium'},
{'id': 342,'title': 'soft big bear','status': 'Medium'}
]
]
私がしたい:
result = [
{
'High': [
{'id': 287, 'title': 'hungry badger'},
{'id': 437, 'title': 'roadtrip to Kansas'}
]
},
{
'Medium': [
{'id': 456, 'title': 'happy title here'},
{'id': 342, 'title': 'soft big bear'}
]
}
]
私が試したもの:
for oneList in nested:
result= {}
for i in oneList:
a= list(i.keys())
m= [i[key] for key in a if key not in ['id','title']]
result[m[0]]=oneList
for key in a:
if key not in ['id','title']:
del i[key]
OMG! @。@ ワオ。あなたはとても速いです。とてもありがとう!!!!完璧に動作します。 – el347
1: 'sum(nested、[])'は使わないでください。フラット化するのが最も遅い方法です。フラット化するほど遅くなります(毎回増えていく「一時的なリスト」を作成しています)。あなたはすでに 'itertools'を使っていますし、結果を反復しています(真の' list'は必要ありません)ので、 'itertools.chain.from_iterable'を使って平坦化してください(' lambda'は悪です/必要がない場合は遅く、 'key'の場合は' operator.itemgetter'): 'groupby(chain.from_iterable(ネストされた)、itemgetter( 'ステータス'))'。 ['sum(x、[])'は_slow_です(コメントを参照)](http://stackoverflow.com/a/39520827/364696)。 – ShadowRanger
@ShadowRangerありがとう!ちょうどこれを実行しました:itertoolsインポートチェーンから; インポート演算子。 s = groupby(chain.from_iterable(results)、key = operator.itemgetter( 'status')); for key、grp in s:print(key、list(grp))良い。 – el347