Python - 过滤(lambda)元组索引错误列表

时间:2013-03-07 00:21:54

标签: python filter tuples

我正在尝试按如下方式过滤元组...为简洁起见,不包括一些代码:

    1) print >> sys.stderr, "audio", audio
    2) print >> sys.stderr, "audio[0]", audio[0]
    3) print >> sys.stderr, "audio[1]", audio[1]
    4) audio_lang = filter(lambda a: a[1]==LANG, audio)

它传递了一个包含2个元素的元组,运行如下:

 D:\Staging\Test>cleanMKV.py .
 audio [('fre',), ('eng',)]
 audio[0] ('fre',)
 audio[1] ('eng',)
 Traceback (most recent call last):
 File "D:\Staging\Test\cleanMKV.py",
 audio_lang = filter(lambda a: a[1]
 File "D:\Staging\Test\cleanMKV.py",
 audio_lang = filter(lambda a: a[1]
 IndexError: tuple index out of range

元组是用RE正确创建的,我正处于我要过滤的点,如第4行所示。它试图在音频中引用音频a [1]。

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:2)

首先,您定义

audio = [('fre',), ('eng',)]

实际上是两个元素('fre',)('eng',)的列表,它们都是仅包含单个元素的元组,分别是'fre''eng'

现在,如果你这样做

audio_lang = filter(lambda a: a[1]==LANG, audio)

你要说的只保留音频元素,其中第二个元素等于LANG。但是,由于您的列表元素('fre',)('eng',)是长度为1的元组,您将获得

IndexError: tuple index out of range

因为您正在尝试访问不存在的第二个元素。

你可以做到

audio_lang = filter(lambda a: a[0]==LANG, audio)

即访问第一个元素或重新定义音频并执行

audio = ['fre', 'eng']
audio_lang = filter(lambda a: a == LANG, audio)

但是我不明白,你想要完成什么,所以这可能不是你想要的。但希望这可以解释您所遇到的错误来源。

答案 1 :(得分:0)

a是一个元组,但audio是一个列表。组成audio的两个元组中每个元组只有一个项目。因此,评估audio[0][1]audio[1][1]将返回tuple index out of range

>>> audio = [('fre',),('eng',)]

>>> audio
[('fre',), ('eng',)]
>>> audio[0]
('fre',)
>>> audio[0][0]
'fre'
>>> audio[0][1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: tuple index out of range

......但是:

>>> audio = [('fre',1),('eng',2)]
>>> audio[0][1]
1