Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列出理解错误、范围错误或语法错误_Python_Python 2.7_List Comprehension - Fatal编程技术网

Python 列出理解错误、范围错误或语法错误

Python 列出理解错误、范围错误或语法错误,python,python-2.7,list-comprehension,Python,Python 2.7,List Comprehension,我有两个列表,我想与列表理解相结合,但不断得到一个索引器:列表索引超出范围错误: 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, ite

我有两个列表,我想与列表理解相结合,但不断得到一个
索引器:列表索引超出范围
错误:

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
这是因为
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]]

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
部分不是条件表达式,而是列表理解语法的一部分。
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]]

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
部分不是条件表达式,而是列表理解语法的一部分。
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]]

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
部分不是条件表达式,而是列表理解语法的一部分。
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]
索引时不会抛出错误。

列表理解的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]
索引时不会抛出错误。

列表理解的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]
索引时不会抛出错误。

列表理解的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]
对其进行索引时,它不会抛出错误。

您的预期输出是什么?我对您的问题进行了编辑,以包含这两个变量;我根据索引错误回答了您的初始问题。您的预期输出是什么?我对您的问题进行了编辑,将两个变量都包括在内;我根据索引错误回答了您的初始问题。您的预期输出是什么?我对您的问题进行了编辑,将两个变量都包括在内;我根据索引错误回答了您的初始问题。您的预期输出是什么?我对您的问题进行了编辑,将两个变量都包括在内;我根据索引错误回答了您最初的问题。您是对的。忘了我的其他条款。修改了OP.@user2242044您不能使用
else