在 Python 中,要检查一个元素是否在两个列表中,我们这样做
if elem in list1 and elem in list2:
我们可以为此做以下事情吗?
if elem in (list1 and list2):
你不能。
list1 and list2
意思是“list1
如果它是空的,list2
否则”。因此,这不会检查您要检查的内容。
在交互式解释器中试试看。
执行此操作的简单方法是您已经拥有的代码:
if elem in list1 and elem in list2:
它有效,易于阅读,并且易于编写。如果有明显的方法来做某事,Python 通常会尽量避免添加不会带来任何好处的同义词。(“TOOWTDI”,或“应该有一种——最好只有一种——明显的方法。”)
如果您正在寻找以某种特定方式更好的答案,而不仅仅是different,根据您的需要有不同的选择。
例如,如果您要经常进行此检查:
elems_in_both_lists = set(list1) & set(list2)
现在你可以这样做:
if elem in elems_in_both_lists:
这更简单,也更快。
不,声明
if elem in (list1 and list2):
不适用于此指定目的。Python 解释器首先检查 list1,如果发现为空(即 - False
),它只返回空列表(为什么? -False
任何事情都会导致错误,所以,为什么要进一步检查?)如果不为空(即评估为True
),它返回list2
(Why? - If first value is True
,表达式的结果取决于第二个值,如果是False
,则表达式评估为False
, else, True
.) ,所以上面的代码变成if elem in list1
orif elem in list2
取决于你的实现. 这被称为短路。
有关短路的Wiki页面可能会有所帮助。
例子 -
>>> list1 = [1, 2]
>>> list2 = [3, 4]
>>> list1 and list2
[3, 4]
>>> list1 = []
>>> list2 = [3, 4]
>>> list1 and list2
[]
不,但你可以写成:
{elem}.intersection (list1, list2)
不,你不能。
list1 and list2
将返回第一个空列表(因为空列表被认为是假值)或者如果所有列表都是非空的,则将使用最右边的列表。
例如:
>>> [1] and [1,2,3]
[1, 2, 3]
>>> [1,2] and []
[]
>>> [] and []
[]
>>> [] and [1,2]
[]
>>> [1] and [] and [1,2]
[]
all() 函数可以在这里使用:
list1 = [1, 2, 3]
list2 = [2, 4, 6]
if all(elem in list for list in [list1, list2]):
print("elem appears in both list1 and list2")
对于有问题的代码示例,布尔运算符and
将返回测试值之一(真值测试),因此您将仅针对其中一个进行测试,这并不能保证正确的结果。
>>> elem = 1
>>> list1 = [2, 3, 0]
>>> list2 = [1, 2, 3]
>>> if elem in (list1 and list2):
... print "IN"
...
>>> IN
(list1 and list2)
将评估布尔运算并返回最后一个列表 -list2
如果两者都有元素。
所以,不,那是行不通的。
list1 = [1, 2, 3]
list2 = [2, 4, 5]
list1 and list2
给出 [2, 4, 5]
list2 and list1
给出 [1, 2, 3]
if 1 in (list1 and list2):
print "YES"
else:
print "NO"
不会
if 1 in (list2 and list1):
print "YES"
else:
print "NO"
会给“是”
你可以这样做:
for item in list1:
if item in list2:
print item
您可以使用列表推导:
if all([element in l for l in [list1, list2]]):
...我刚刚找到了一种扩展方法来检查每个列表中是否有多个元素:
if all([all([x in l for x in [elem1, elem2]]) for l in [list1, list2]]):
我猜只有 2 个列表和 2 个元素,你宁愿像第一个一样做两个(并且只是写and
在两者之间),但是如果有一天你需要检查 10 个元素是否在 4 个列表中,这可能会派上用场。
执行此操作的最短代码是通过添加它们然后检查将两个列表连接为一个,就像这样。
a = [1, 2, 3]
b = [4, 5, 6]
print(1 in a + b)
print(5 in a + b)
print(9 in a + b)
但是,这并不是很有效,因为它将创建一个包含所有元素的新列表a
and b
。一种更有效的方法是使用来自 itertools 的链迭代器。
from itertools import chain
a = [1, 2, 3]
b = [4, 5, 6]
print(1 in chain(a, b))
print(5 in chain(a, b))
print(9 in chain(a, b))
如有必要,添加更多列表甚至列表列表也很容易。
from itertools import chain
a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9]
print(1 in a + b + c)
print(5 in a + b + c)
print(9 in a + b + c)
print(1 in chain(a, b, c))
print(5 in chain(a, b, c))
print(10 in chain(a, b, c))
print(9 in chain.from_iterable([a, b, c])) # A list of lists