这是Python中的一个奇怪的错误:
l1 = ['a', 'ab', 'cc', 'bc']
l1.sort(key=lambda x: zip(*l1)[0].count(x[0]))
此代码段的目的是按照第一个字母的频率对元素进行排序。但是,这会产生错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
IndexError: list index out of range
单独计算密钥不会给我一个错误,但是:
sortkeys = [zip(*l1)[0].count(x[0]) for x in l1]
IndexError
来自哪里?当然,zip(*l1)[0]
不是空的(它等于('a', 'a', 'c', 'b')
),x[0]
不能为空,因为所有列表元素都是非空的...所以发生了什么?
编辑:我很清楚这不是排序列表的理想方式。我很好奇为什么会发生这种情况,而不是我应该写的东西。
答案 0 :(得分:1)
您可以对此进行调查,以确认列表在排序到位时确实为空。 事实上 - 这是一个非常好的编程方法 - 因为它会给程序员带来错误,忘记它已经排序到位而不是产生很难以后发现的错误。
试试这个:
l1 = ['a', 'ab', 'cc', 'bc']
def y(x):
print l1
return zip(*l1)[0].count(x[0])
y('cc')
l1.sort(key = y)
输出将是:
['a', 'ab', 'cc', 'bc']
[]
(然后是例外)