我想比较此列表中的所有项目:l = [(True, False, True), (False, True, True), (False, False, True), (True, False, False), (False, False, False), (True, True, False), (False, True, False)]我想保留与所有其他元素相比始终满足以下条件的所有元素:a 和 b 相同,或者a 为真例如:# True, True, Truea --> (True, False, True) b --> (True, False, False)第一个为 true,因为第一个元素相同;第二个为 true,因为第二个值相同;第三个为 true,因为 为atrue。这些元组的比较应该返回 true。所以我有这个代码:to_keep = []for i in range(len(l)): if all([map(lambda x, y: x == y or x, l[i], l[s]) for s in range(len(l))]): to_keep.append(l[i])print(to_keep)对于 中的每个项目l,如果每次比较都返回 true,则将此元素附加到to_keep。问题是,由于某种神秘的原因,它总是评估为 true,因此所有元素都被添加到to_keep.[(True, False, True), (False, True, True), (False, False, True), (True, False, False), (False, False, False), (True, True, False), (False, True, False)]谁能解释/纠正我的错误?
1 回答
Smart猫小萌
TA贡献1911条经验 获得超7个赞
该map函数生成一个可迭代对象,即使为空或充满假值,它也是真实的:
>>> bool(map(bool, []))
True
>>> bool(map(bool, [False]))
True
因此,all(map(...) for ...)总是True。请注意,使用生成器表达式或(列表)理解对此无关紧要。
使用内部all计算每个map,并使用外部all计算所有 s 的结果all(map(...)):
to_keep = []
for i in range(len(l)):
# v for *all* tuples...
if all(all(map(lambda x, y: x == y or x, l[i], l[s])) for s in range(len(l))):
# ^ for *all* elements of each tuple
to_keep.append(l[i])
print(to_keep) # []
添加回答
举报
0/150
提交
取消