<p>解决此问题的一个经典方法是使用“装饰、排序、取消装饰”习惯用法,使用python的内置<code>zip</code>函数尤其简单:</p>
<pre><code>>>> list1 = [3,2,4,1, 1]
>>> list2 = ['three', 'two', 'four', 'one', 'one2']
>>> list1, list2 = zip(*sorted(zip(list1, list2)))
>>> list1
(1, 1, 2, 3, 4)
>>> list2
('one', 'one2', 'two', 'three', 'four')
</code></pre>
<p>这些当然不再是列表,但如果重要的话,很容易纠正:</p>
<pre><code>>>> list1, list2 = (list(t) for t in zip(*sorted(zip(list1, list2))))
>>> list1
[1, 1, 2, 3, 4]
>>> list2
['one', 'one2', 'two', 'three', 'four']
</code></pre>
<p>值得注意的是,上面提到的可能会为了简洁而牺牲速度;就地版本占用了3行,在我的机器上对于小列表来说速度稍微快一点:</p>
<pre><code>>>> %timeit zip(*sorted(zip(list1, list2)))
100000 loops, best of 3: 3.3 us per loop
>>> %timeit tups = zip(list1, list2); tups.sort(); zip(*tups)
100000 loops, best of 3: 2.84 us per loop
</code></pre>
<p>另一方面,对于较大的列表,单行版本可能更快:</p>
<pre><code>>>> %timeit zip(*sorted(zip(list1, list2)))
100 loops, best of 3: 8.09 ms per loop
>>> %timeit tups = zip(list1, list2); tups.sort(); zip(*tups)
100 loops, best of 3: 8.51 ms per loop
</code></pre>
<p>正如Quantum7所指出的,<a href="https://stackoverflow.com/a/9764390/577088">JSF's suggestion</a>速度还要快一点,但它可能只会快一点,因为Python对所有基于键的排序都使用<a href="https://hg.python.org/cpython/file/e4c32152b25b/Objects/listobject.c#l1863" rel="noreferrer">very same DSU idiom internally</a>。它只是发生在离裸金属更近一点的地方。(这显示了<code>zip</code>例程的优化程度!)</p>
<p>我认为基于<code>zip</code>的方法更灵活,可读性更强,所以我更喜欢它</p>