Python 可以在不同长度的iterable上使用列表理解吗?

Python 可以在不同长度的iterable上使用列表理解吗?,python,list-comprehension,Python,List Comprehension,是否可以通过列表理解创建一个列表,该列表使用至少有一个条件假设存在来自基础iterable元素的索引值(即使另一个条件不存在并且(应该?)导致表达式为True) 执行下面的代码时,解释器将IndexError:tuple index抛出超出范围 my_lst = [('30', ), ('30', '125'), ('30', '127'), ('30', '125', '567')] [tpl for tpl in my_lst if (len(tpl) == 1 or tpl[2] == '

是否可以通过列表理解创建一个列表,该列表使用至少有一个条件假设存在来自基础iterable元素的索引值(即使另一个条件不存在并且(应该?)导致表达式为
True

执行下面的代码时,解释器将IndexError:tuple index抛出超出范围

my_lst = [('30', ), ('30', '125'), ('30', '127'), ('30', '125', '567')]
[tpl for tpl in my_lst if (len(tpl) == 1 or tpl[2] == '125')]
# Desired result: [('30', ), ('30', '125'), ('30', '125', '567')]

Python索引是基于0的。索引
2
将检索第三项,而不是第二项

您想访问索引
1
(第二项):


Python索引是基于0的。索引
2
将检索第三项,而不是第二项

您想访问索引
1
(第二项):


Python索引是基于0的。索引2将检索第三项,而不是第二项

您想访问索引1(第二项):

[my_lst中tpl的tpl如果(len(tpl)==1或tpl[1]==125')]

这仍然有一个潜在的bug。可能存在长度为零的元组,这将导致错误。基于代码的其余部分,这可能不是问题,但如果是,则应使用:

为排除零长度元组而编辑

[tpl for tpl in my_lst if (len(tpl) != 0 and (len(tpl) == 1 or tpl[1] == '125'))]

Python索引是基于0的。索引2将检索第三项,而不是第二项

您想访问索引1(第二项):

[my_lst中tpl的tpl如果(len(tpl)==1或tpl[1]==125')]

这仍然有一个潜在的bug。可能存在长度为零的元组,这将导致错误。基于代码的其余部分,这可能不是问题,但如果是,则应使用:

为排除零长度元组而编辑

[tpl for tpl in my_lst if (len(tpl) != 0 and (len(tpl) == 1 or tpl[1] == '125'))]

哇!脸在掌心。对不起,伙计们。感谢您的快速响应。len==1的元组将抛出相同的错误。添加
len(tpl)==2和&tpl[1]==125
@DavidK-J-如果
len(tpl)==1
返回
False
,则
tpl
必须有多个项目,并且
tpl[1]
可以正常工作。只有存在空元组时,我的代码才会失败。但是没有任何迹象表明OP的问题中可能有一个空元组。如果
len(tpl)==1
返回false,则可能有0或2+个元素,并将引发相同的异常。称之为良好实践/防御性编程。哇。脸在掌心。对不起,伙计们。感谢您的快速响应。len==1的元组将抛出相同的错误。添加
len(tpl)==2和&tpl[1]==125
@DavidK-J-如果
len(tpl)==1
返回
False
,则
tpl
必须有多个项目,并且
tpl[1]
可以正常工作。只有存在空元组时,我的代码才会失败。但是没有任何迹象表明OP的问题中可能有一个空元组。如果
len(tpl)==1
返回false,则可能有0或2+个元素,并将引发相同的异常。称之为良好实践/防御编程。这将返回空元组?我不希望列表理解返回空元组(在我的应用程序中,它无论如何都不应该存在)。它将返回空元组。如果不希望这样,则需要其他一些代码。但这将防止索引超出范围错误编辑以排除零长度元组这将返回空元组?我不希望列表理解返回空元组(在我的应用程序中,它无论如何都不应该存在)。它将返回空元组。如果不希望这样,则需要其他一些代码。但这将防止索引超出范围,从而排除零长度元组