为了账号安全,请及时绑定邮箱和手机立即绑定

应用于元组的映射函数总是莫名其妙地计算为 True

应用于元组的映射函数总是莫名其妙地计算为 True

子衿沉夜 2023-10-11 21:14:27
我想比较此列表中的所有项目: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)  # []


查看完整回答
反对 回复 2023-10-11
  • 1 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信