我想比較此列表中的所有項目: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
提交
取消