列出理解超出范围的错误或语法

2024-09-30 18:12:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个列表,我想结合列表理解,但一直得到一个IndexError: List index out of range错误:

List1 = [[u'Case1', u'DP1', u'Configuration1', u'New'], [u'Case2', u'DP2', u'Configuration2', u'New']]
List2 = [[u'DP1', u'EB1', u'Typ1'], [u'DP2', u'EB2', u'Type2'], [u'DP3', u'EB3', u'Type2']]


for key, item in enumerate(List2):
     List2[key] =  [item[0],[x for x in List1 if (x[1] == item[0] and x[2] == 'Configuration1')][0][3]]

print List2

我试图添加else None,但是得到了一个SyntaxError: invalid syntax异常:

^{pr2}$

我的预期产出是:

[[u'DP1', u'New'], [u'DP2', None], [u'DP3',None]]

Tags: keyinnone列表newforitemlist2
2条回答

您在List1中的第二个列表在索引2中没有值'Configuration1',因此列表理解是空的。索引空列表会产生索引错误:

>>> List1 = [[u'Case1', u'DP1', u'Configuration1', u'New'], [u'Case2', u'DP2', u'Configuration2', u'New']]
>>> List2 = [[u'DP1', u'EB1', u'Typ1'], [u'DP2', u'EB2', u'Type2'], [u'DP3', u'EB3', u'Type2']]
>>> item = List2[1]
>>> [x for x in List1 if x[1] == item[0] and x[2] == 'Configuration1']
[]
>>> [x for x in List1 if x[1] == item[0] and x[2] == 'Configuration1'][0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

更改后的语法无效;不能在列表理解if筛选器中使用else

^{pr2}$

这是因为if部分是不是一个条件表达式,而是列表理解语法的一部分。if测试过滤元素。您可以在列表理解的左侧表达式中使用条件表达式,但在这里这样做没有意义。在

如果要查找匹配的数据,应将List1转换为字典:

configuration_data = {(entry[1], entry[2]): entry[3] for entry in List1}

这将索引1和索引2处的项映射到索引3处的元素,这样您就可以简单地使用字典查找来填充List2的新列表对象:

List2 = [[item[0], configuration_data.get((item[0], 'Configuration1'), None)]
         for item in List2]

此列表理解的效果与使用enumerate处理for循环的效果相同;生成一个具有匹配配置数据的新列表:

>>> List1 = [[u'Case1', u'DP1', u'Configuration1', u'New'], [u'Case2', u'DP2', u'Configuration2', u'New']]
>>> List2 = [[u'DP1', u'EB1', u'Typ1'], [u'DP2', u'EB2', u'Type2'], [u'DP3', u'EB3', u'Type2']]
>>> configuration_data = {(entry[1], entry[2]): entry[3] for entry in List1}
>>> [[item[0], configuration_data.get((item[0], 'Configuration1'), None)] for item in List2]
[[u'DP1', u'New'], [u'DP2', None], [u'DP3', None]]

列表理解的if语法不允许使用“else”。 此列表理解将生成您期望的输出:

[item[0],[x if (x[1] == item[0] and x[2] == 'Configuration1') else [None] * 4 for x in List1][0][3]]

我只是将if..else交换到列表理解的前面,并将None更改为一个列表,这样当您用[3]索引它时,它不会抛出错误。在

相关问题 更多 >