0

次のようなサンプル配列があるとします。

color_values = [{'score': 3, 'color': u'blue'}, {'score': 1, 'color': u'red'}, {'score': 4, 'color': u'green'}, {'score': 4, 'color': u'red'}, {'score': 2, 'color': u'blue'}]

すべての同じ色のスコアを平均する新しい配列のコードを Python で作成するにはどうすればよいですか? したがって、新しい配列は次のようになります。

color_values = [{'score': 2.5, 'color': u'blue'}, {'score': 2.5, 'color': u'red'}, {'score': 4, 'color': u'green'}]
4

2 に答える 2

1

この種の問題を解決する最も簡単な(最短ではないにしても)方法はdict、キーから値のリストを作成し、それを集約することです。

by_color = {}
for obj in color_values:
    by_color.setdefault(obj['color'], []).append(obj['score'])
color_values = [{'score': float(sum(value)) / len(value), 'color': key}
                for key, value in by_color.items()]
于 2012-10-24T15:35:04.173 に答える
1

リスト内包表記の使用:

average = lambda l: sum(l) / float(len(l))
[{'score': average([d['score'] for d in color_values if d['color'] is color]),
  'color': color} for color in set(d['color'] for d in color_values)]

出力:

>>> color_values = [{'score': 3, 'color': u'blue'}, {'score': 1, 'color': u'red'}, {'score': 4, 'color': u'green'}, {'score': 4, 'color': u'red'}, {'score': 2, 'color': u'blue'}]
>>> average = lambda l: sum(l) / float(len(l))
>>> [{'score': average([d['score'] for d in color_values if d['color'] is color]),
...   'color': color} for color in set(d['color'] for d in color_values)]
[{'color': u'blue', 'score': 2.5}, {'color': u'green', 'score': 4.0}, {'color': u'red', 'score': 2.5}]
于 2012-10-24T15:41:39.383 に答える