Python 与编写循环相比,列表理解缺少一些值

Python 与编写循环相比,列表理解缺少一些值,python,Python,我有两个数据集,found和allowed。我想检查发现的中是否有任何观察结果未出现在允许的中,以便确保将它们标记为不允许 found = [["A", "B", "C"], [10, 20, 30], ["X", "Y", "Z"]] allowed = [["A", "B", "C", "D"], [20, 30, 40], ["W", "X", "Y"]] 如果我运行以下命令,我会得到正确的答案,即[(1,10),(2,'Z')] 但是,如果我运行以下命令,它需要更少的行并且我认为更容易

我有两个数据集,
found
allowed
。我想检查发现的
中是否有任何观察结果未出现在
允许的
中,以便确保将它们标记为不允许

found = [["A", "B", "C"], [10, 20, 30], ["X", "Y", "Z"]]
allowed = [["A", "B", "C", "D"], [20, 30, 40], ["W", "X", "Y"]]
如果我运行以下命令,我会得到正确的答案,即
[(1,10),(2,'Z')]

但是,如果我运行以下命令,它需要更少的行并且我认为更容易,它将返回
new_values=[(2,'Z')]


(1,10)
发生了什么事?如果我在允许的[1]
中运行
10,我会得到
False
,这让我觉得它应该出现在
新值中

您正在为for循环中的
新值重新赋值:

for x in range(0, len(allowed)):
    new_values = [(x, val) for val in found[x] if val not in allowed[x]]
试试这个:

new_values = []
for x in range(0, len(allowed)):
    new_values.extend([(x, val) for val in found[x] if val not in allowed[x]])
或者,更简短地使用列表理解:

new_values = [(x, val) for x in range(0, len(allowed)) for val in found[x] if val not in allowed[x]]

如果还需要值的索引,通常认为使用
enumerate
对序列进行迭代更具python风格。

在嵌套理解中插入
enumerate
,可以将其缩短:

new_values = [(i, x) for i, f in enumerate(found) for x in f if x not in allowed[i]]

如果在
中找到了多个不允许的
,您希望得到什么样的数据结构?如上所述,正确答案是
[(1,10),(2,Z')]
new_values = [(x, val) for x in range(0, len(allowed)) for val in found[x] if val not in allowed[x]]
new_values = [(x, val) for x, allowable in enumerate(allowed)
                        for val in found[x] if val not in allowable]
new_values = [(i, x) for i, f in enumerate(found) for x in f if x not in allowed[i]]