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

我想比较此列表中的所有项目:


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,  True

a --> (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)]

谁能解释/纠正我的错误?


子衿沉夜
浏览 111回答 1
1回答

Smart猫小萌

该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)  # []
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python