列表理解超出范围错误或语法错误
List comprehension out or range error or syntax error
我有两个列表,我想将它们与列表理解相结合,但不断收到 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
异常:
List2[key] = [item[0],[x for x in List1 if (x[1] == item[0] and x[2] == 'Configuration1') else None][0][3]]
我的预期输出是:
[[u'DP1', u'New'], [u'DP2', None], [u'DP3',None]]
您在 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
您修改后的语法无效;你不能在列表理解中使用 else
if
过滤器:
>>> [x for x in List1 if (x[1] == item[0] and x[2] == 'Configuration1') else None]
File "<stdin>", line 1
[x for x in List1 if (x[1] == item[0] and x[2] == 'Configuration1') else None]
^
SyntaxError: invalid syntax
那是因为 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]
这个列表推导实现的效果与您尝试使用枚举的 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]
对其进行索引时,它不会引发错误。
我有两个列表,我想将它们与列表理解相结合,但不断收到 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
异常:
List2[key] = [item[0],[x for x in List1 if (x[1] == item[0] and x[2] == 'Configuration1') else None][0][3]]
我的预期输出是:
[[u'DP1', u'New'], [u'DP2', None], [u'DP3',None]]
您在 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
您修改后的语法无效;你不能在列表理解中使用 else
if
过滤器:
>>> [x for x in List1 if (x[1] == item[0] and x[2] == 'Configuration1') else None]
File "<stdin>", line 1
[x for x in List1 if (x[1] == item[0] and x[2] == 'Configuration1') else None]
^
SyntaxError: invalid syntax
那是因为 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]
这个列表推导实现的效果与您尝试使用枚举的 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]
对其进行索引时,它不会引发错误。