<p>因此,只要您的数据表现良好,就可以使用defaultdict将数字分组为DEQUE:</p>
<pre><code>In [14]: from collections import defaultdict, deque
In [15]: grouper = defaultdict(deque)
In [16]: for a,b in L:
...: grouper[b].append(a)
...:
</code></pre>
<p>然后简单地说:</p>
<pre><code>In [17]: grouper
Out[17]:
defaultdict(collections.deque,
{'AMIE': deque([2]),
'JACK': deque([3]),
'JAYCE': deque([1, 5]),
'STEVE': deque([4])})
In [18]: [[grouper[x].popleft(), x] for x in sortedNames]
Out[18]: [[2, 'AMIE'], [3, 'JACK'], [1, 'JAYCE'], [5, 'JAYCE'], [4, 'STEVE']]
</code></pre>
<p>我意识到在列表中使用<code>pop</code>是一个丑陋的缺点。。。你知道吗</p>
<p>这里有一种只使用<code>dict</code>和<code>list</code>的方法:</p>
<pre><code>In [19]: grouper = {}
...: for a,b in L:
...: grouper.setdefault(b, []).append(a)
...:
In [20]: grouper = {k:v[::-1] for k, v in grouper.items()}
In [21]: [[grouper[x].pop(), x] for x in sortedNames]
Out[21]: [[2, 'AMIE'], [3, 'JACK'], [1, 'JAYCE'], [5, 'JAYCE'], [4, 'STEVE']]
</code></pre>
<p>两种方法都是O(N)。你知道吗</p>
<p/><h3>编辑</h3>我刚刚意识到,您真正想要的不是生成排序名称列表,而是直接使用键对<code>L</code>排序:
<pre><code>In [26]: L
Out[26]: [[1, 'JAYCE'], [2, 'AMIE'], [3, 'JACK'], [4, 'STEVE'], [5, 'JAYCE']]
In [27]: from operator import itemgetter
In [28]: sorted(L, key=itemgetter(1))
Out[28]: [[2, 'AMIE'], [3, 'JACK'], [1, 'JAYCE'], [5, 'JAYCE'], [4, 'STEVE']]
</code></pre>