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]]