<p>这个问题源于您正在使用<code>key</code>。用于指定要比较的值的。你有一个异类名单。最后将比较不同类型的元素。我建议您看看<code>cpm</code>参数,它是一个比较两个元素的函数。这样,您可以更精确地使用排序规则。你知道吗</p>
<p>如果我对你的问题理解正确,你很可能会想要这样:</p>
<pre><code>def compare(a, b):
if isinstance(a, str) and isinstance(b, str):
return cmp(a, b)
elif isinstance(a, str) and isinstance(b, tuple):
return cmp(a, b[1])
elif isinstance(b, str) and isinstance(a, tuple):
return cmp(a[1], b)
elif isinstance(a, tuple) and isinstance(b, tuple):
return cmp(a[1], b[1])
else:
print "Impossible"
return 0
cols.sort(cmp=compare)
print cols
</code></pre>
<p>在查看列表输入时,有4种情况需要区分。<code>string string</code>病例、<code>string tuple</code>、<code>tuple string</code>和<code>tuple tuple</code>病例。你知道吗</p>
<p>我们对每种情况进行说明,并为每种情况编写比较规则。你知道吗</p>
<p>在<code>return</code>语句中使用的<code>cmp</code>函数只是通知术语之间的关系,<code>-1</code>表示<code>a < b</code>,<code>0</code>表示<code>a = b</code>,<code>1</code>表示<code>a > b</code>。你知道吗</p>
<p>请注意,比较是<code>lexicographic</code>(字符串比较)。您可能需要将字符串大小写为整数并比较它们。你知道吗</p>
<p>结果是:</p>
<pre><code>['2016', ('a', '2016'), ('c', '2016'), ('b', '2016'), '2017', ('a', '2017'), ('c', '2017'), ('b', '2017'), '2018', ('a', '2018'), ('c', '2018')]
</code></pre>
<p>如果将访问元组的第二个元素(本例中的年份)替换为访问第一个元素,则会得到以下结果:</p>
<pre><code>['2016', '2017', '2018', ('a', '2016'), ('a', '2017'), ('a', '2018'), ('b', '2016'), ('b', '2017'), ('c', '2016'), ('c', '2017'), ('c', '2018')]
</code></pre>
<p>您可以添加一个标志来决定比较应该使用元组的哪个项。你知道吗</p>