尝试在排序期间引用列表时的IndexError

时间:2014-06-12 19:17:06

标签: python sorting indexoutofboundsexception python-2.x

这是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]不能为空,因为所有列表元素都是非空的...所以发生了什么?

编辑:我很清楚这不是排序列表的理想方式。我很好奇为什么会发生这种情况,而不是我应该写的东西。

1 个答案:

答案 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']
[]

(然后是例外)