为何双条件用==时代码正常,用!=却返回空列表?
问题分析:筛选条件逻辑错误导致空列表结果
问题描述
两段Python代码用于筛选列表元素:
- 第一段尝试筛选**不满足
name="a"且author="b"**的元素,但返回空列表 - 第二段以
name="a"且author="b"为条件,能正确获取符合要求的元素
两段代码如下:
第一段代码(返回空列表)
d1 = [{"name": "a", "author": "b", "read": False}, {"name": "c", "author": "b", "read": False}, {"name": "b", "author": "b", "read": False}] temp = [] for i in range(len(d1)): if d1[i]['name'] != "a" and d1[i]['author'] != "b": temp.append(d1[i]) print(temp) # RESULT []
第二段代码(返回正确结果)
d1 = [{"name": "a", "author": "b", "read": False}, {"name": "c", "author": "b", "read": False}, {"name": "b", "author": "b", "read": False}] temp = [] for i in range(len(d1)): if d1[i]['name'] == "a" and d1[i]['author'] == "b": temp.append(d1[i]) print(temp) # RESULT [{'name': 'a', 'author': 'b', 'read': False}]
原因解析
你想筛选的是**不满足“name=a且author=b”**的元素,但条件逻辑写错了。根据逻辑运算的德摩根定律:
- 原条件:
name == "a" and author == "b" - 它的否定应该是:
name != "a" or author != "b"(而非and)
观察你的列表,所有元素的author都是"b",所以d1[i]['author'] != "b"对所有元素都不成立。用and连接时,整个条件永远为False,自然不会有元素被添加到temp中。
正确写法
把条件里的and替换成or,就能得到预期结果:
d1 = [{"name": "a", "author": "b", "read": False}, {"name": "c", "author": "b", "read": False}, {"name": "b", "author": "b", "read": False}] temp = [] for i in range(len(d1)): if d1[i]['name'] != "a" or d1[i]['author'] != "b": temp.append(d1[i]) print(temp) # RESULT [{'name': 'c', 'author': 'b', 'read': False}, {'name': 'b', 'author': 'b', 'read': False}]
也可以用更简洁的列表推导式,直接对原条件取反,逻辑更清晰:
temp = [item for item in d1 if not (item['name'] == "a" and item['author'] == "b")]
内容的提问来源于stack exchange,提问作者Pavel
相关产品推荐
相关产品推荐

