<p>您可以使用嵌套列表理解和一些讨厌的lambda来实现这一点:</p>
<pre><code>from itertools import groupby
import pprint
pp=pprint.PrettyPrinter()
data = [{'location': 'eastus', 'sku': 'S', 'term': 'P1', 'scope': '1'},
{'location': 'india', 'sku': 'a', 'term': 'P1', 'scope': '2'},
{'location': 'eastus', 'sku': 'S', 'term': 'P3', 'scope': '3'},
{'location': 'india', 'sku': 'f', 'term': 'P1', 'scope': '4'},
{'location': 'japan', 'sku': 'a', 'term': 'P1', 'scope': '5'},
{'location': 'india', 'sku': 'a', 'term': 'P3', 'scope': '6'}]
pp.pprint([(lambda k,g:k.update({"new_key":[(lambda i:i.pop("location") and i.pop("sku") and i)(item) for item in g]}) or k)(k,g) for k,g in groupby(sorted(data,key=lambda i:(i["location"],i["sku"])), lambda i:{"location":i["location"],"sku":i["sku"]})])
</code></pre>
<p>测试在这里:<a href="https://ideone.com/24bjKw" rel="nofollow noreferrer">https://ideone.com/24bjKw</a>。然而,这个函数在这个过程中破坏了原始的<code>data</code>(调用原始dict的工作)。你知道吗</p>
<p>内部lambda中的步骤链接是唯一棘手的部分:</p>
<pre><code>lambda i:i.pop("location") and i.pop("sku") and i
</code></pre>
<p>使用<code>and</code>,因为<code>pop</code>返回它所发现的内容,所以这种方式短路求值不能干扰<code>i</code>将成为表达式的实际值。(如果对<code>pop()</code>找到密钥有疑问,可能是<code>i.pop("...",True)</code>)</p>
<pre><code>lambda k,g:k.update(...) or k
</code></pre>
<p>需要<code>or</code>,因为<code>update()</code>返回<code>None</code>(因此<code>and</code>会在这里短路)。你知道吗</p>
<p>剩下的只是打字。不幸的是,我不知道如何把它格式化成更好的形状。你知道吗</p>