/ /リスト要素をPythonのtheirsプロパティで区切ります - python

Pythonでリストの要素をそれぞれのプロパティで区切ります - python

私はリストを持っている 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}]})