私はリストを持っている p1
:
p1 = [
{"id": 1, "area": 5},
{"id": 2, "area": 6},
{"id": 3, "area": 10},
{"id": 4, "area": 6},
{"id": 5, "area": 6},
{"id": 6, "area": 6},
{"id": 7, "area": 4},
{"id": 8, "area": 4}
]
そして、私はこのリストを area
値は、このように(p2
):
p2 = {
4: [
{"id": 7, "area": 4},
{"id": 8, "area": 4}
],
5: [
{"id": 1, "area": 5}
],
6: [
{"id": 2, "area": 6},
{"id": 4, "area": 6},
{"id": 5, "area": 6},
{"id": 6, "area": 6}
],
10: [
{"id": 3, "area": 10}
]
}
私の解決策は次のとおりです。
areas = {x["area"] for x in p1}
p2 = {}
for area in areas:
p2[area] = [x for x in p1 if x["area"] == area]
それはうまくいくようですが、より良い、より "ピジョン"なソリューションはありますか?
回答:
回答№1の場合は3使用 groupby
あなたは得る
>>> import itertools
>>> f = lambda t: t["area"]
>>> {i: list(b) for i, b in itertools.groupby(sorted(p1, key=f), key=f)}
贈る
{4: [{"area": 4, "id": 7},
{"area": 4, "id": 8}],
5: [{"area": 5, "id": 1}],
6: [{"area": 6, "id": 2},
{"area": 6, "id": 4},
{"area": 6, "id": 5},
{"area": 6, "id": 6}],
10: [{"area": 10, "id": 3}]}
編集:lambdaを使うのが好きでないなら、bro-grammerの示唆するようにすることもできます
>>> import operator
>>> f = operator.itemgetter("area")
回答№2の場合は3
あなたは単に使用することができます defaultdict
:
from collections import defaultdict
result = defaultdict(list)
for i in p1:
result[i["area"]].append(i)
答え№3の2
はい、グループ化イディオムのいずれかを使用します。バニラを使用する dict
:
In [15]: p1 = [
...: {"id": 1, "area": 5},
...: {"id": 2, "area": 6},
...: {"id": 3, "area": 10},
...: {"id": 4, "area": 6},
...: {"id": 5, "area": 6},
...: {"id": 6, "area": 6},
...: {"id": 7, "area": 4},
...: {"id": 8, "area": 4}
...: ]
In [16]: p2 = {}
In [17]: for d in p1:
...: p2.setdefault(d["area"], []).append(d)
...:
In [18]: p2
Out[18]:
{4: [{"area": 4, "id": 7}, {"area": 4, "id": 8}],
5: [{"area": 5, "id": 1}],
6: [{"area": 6, "id": 2},
{"area": 6, "id": 4},
{"area": 6, "id": 5},
{"area": 6, "id": 6}],
10: [{"area": 10, "id": 3}]}
またはもっときれいに、 defaultdict
:
In [23]: from collections import defaultdict
In [24]: p2 = defaultdict(list)
In [25]: for d in p1:
...: p2[d["area"]].append(d)
...:
In [26]: p2
Out[26]:
defaultdict(list,
{4: [{"area": 4, "id": 7}, {"area": 4, "id": 8}],
5: [{"area": 5, "id": 1}],
6: [{"area": 6, "id": 2},
{"area": 6, "id": 4},
{"area": 6, "id": 5},
{"area": 6, "id": 6}],
10: [{"area": 10, "id": 3}]})