<p>这个答案类似于<a href="https://stackoverflow.com/a/3749740/1056941">@PaulMcG's answer</a>,但不需要对输入进行排序</p>
<p>对于那些进入函数式编程的人,<code>groupBy</code>可以写在一行中(不包括导入!),与<code>itertools.groupby</code>不同的是,它不需要对输入进行排序:</p>
<pre class="lang-py prettyprint-override"><code>from functools import reduce # import needed for python3; builtin in python2
from collections import defaultdict
def groupBy(key, seq):
return reduce(lambda grp, val: grp[key(val)].append(val) or grp, seq, defaultdict(list))
</code></pre>
<p>(在<code>lambda</code>中<code>... or grp</code>的原因是<code>reduce()</code>要想工作,<code>lambda</code>需要返回它的第一个参数;因为<code>list.append()</code>总是返回<code>None</code>,<code>or</code>总是返回<code>grp</code>。也就是说,绕过python的限制,lambda只能对单个表达式求值是一种技巧。)</p>
<p>这将返回一个dict,其键是通过计算给定函数找到的,其值是按原始顺序列出的原始项。对于OP的示例,将其称为<code>groupBy(lambda pair: pair[1], input)</code>将返回以下命令:</p>
<pre class="lang-py prettyprint-override"><code>{'KAT': [('11013331', 'KAT'), ('9843236', 'KAT')],
'NOT': [('9085267', 'NOT'), ('11788544', 'NOT')],
'ETH': [('5238761', 'ETH'), ('5349618', 'ETH'), ('962142', 'ETH'), ('7795297', 'ETH'), ('7341464', 'ETH'), ('5594916', 'ETH'), ('1550003', 'ETH')]}
</code></pre>
<p>根据<a href="https://stackoverflow.com/a/3749740/1056941">@PaulMcG's answer</a>,OP请求的格式可以通过将其包装到列表中来找到。这样就可以了:</p>
<pre class="lang-py prettyprint-override"><code>result = {key: [pair[0] for pair in values],
for key, values in groupBy(lambda pair: pair[1], input).items()}
</code></pre>