<p>您可以使用itertools模块中的<a href="https://docs.python.org/3/library/itertools.html#itertools.groupby" rel="nofollow">^{<cd1>}</a>和<code>operator</code>模块中的<a href="https://docs.python.org/3/library/operator.html#operator.itemgetter" rel="nofollow">^{<cd2>}</a>来实现这一点。可以将<em>grouby</em>操作看作是从记录中返回连续键和组的一种方法。为了让它工作,您需要按照<code>sorted</code>函数在这里所做的“coach”值对列表中的“items”进行排序。当然,为了自定义排序顺序,您需要提供一个键函数,其中一种方法是使用类似于<code>sorted(d, key=lambda _: _["coach"])</code>的lambda表达式,但我更喜欢使用<code>sorted(d, key=itemgetter('coach'))</code>的另一种方法,也就是说,您还需要向<code>groupby</code>提供键参数,这是一个计算每个元素的键值的函数在<a href="https://docs.python.org/3/library/itertools.html#itertools.groupby" rel="nofollow">documentation</a>中提到,同样可以使用<code>key=itemgetter("coach")</code>。你知道吗</p>
<pre><code>from itertools import groupby
from operator import itemgetter
def exportplayers(request):
d = [
{"players": [{"id": 179, "name": "Santosh"}, {"id": 180, "name": "Hari"}], "coach": "Xavi Alonso"},
{"players": [{"id": 175, "name": "Hitman"}], "coach": "Anna Puyol"}
]
my_list = []
for g, data in groupby(sorted(d, key=itemgetter('coach')), key=itemgetter('coach')):
my_list.append({"coach": g, "players": [player for item in data for player in item["players"]]})
return HttpResponse(json.dumps(my_list))
</code></pre>
<p>使用lambda表达式作为键函数的演示:</p>
<pre><code>>>> from itertools import groupby
>>> d = [
... {"players": [{"id": 179, "name": "Santosh"}], "coach": "Xavi Alonso"},
... {"players": [{"id": 180, "name": "Hari"}], "coach": "Xavi Alonso"},
... {"players": [{"id": 175, "name": "Hitman"}], "coach": "Anna Puyol"}
... ]
>>> sorted_d = sorted(d, key=lambda _: _['coach'])
>>> for g, data in groupby(sorted_d, key=lambda _: _['coach']):
... print({"coach": g, "players": [player for item in data for player in item["players"]]})
...
{'coach': 'Anna Puyol', 'players': [{'id': 175, 'name': 'Hitman'}]}
{'coach': 'Xavi Alonso', 'players': [{'id': 179, 'name': 'Santosh'}, {'id': 180, 'name': 'Hari'}]}
</code></pre>