在Python中,为了检查元素是否在两个列表中,我们
if elem in list1 and elem in list2:
我们可以为此目的做以下事吗?
if elem in (list1 and list2):
答案 0 :(得分:13)
不,你不能。
list1 and list2
表示“list1
如果它为空,list2
则为”。因此,这不会检查您要检查的内容。
在交互式口译员中尝试一下,然后看看。
执行此操作的简单方法是您已有的代码:
if elem in list1 and elem in list2:
它很有效,很容易阅读,写起来很明显。如果有一种明显的方法可以做某事,Python通常会尝试避免添加不会增加任何好处的同义词。 (“TOOWTDI”,或“应该有一个 - 最好只有一个 - 明显的方式去做。”)
如果您正在以某种特定的方式寻找更好的答案,而不仅仅是不同的,根据您的需要,有不同的选项。
例如,如果您要经常进行此检查:
elems_in_both_lists = set(list1) & set(list2)
现在你可以这样做:
if elem in elems_in_both_lists:
这更简单,也更快。
答案 1 :(得分:4)
不,声明
if elem in (list1 and list2):
不适用于此指定用途。 Python解释器所做的是首先检查list1,如果发现为空(即 - False
),它只返回空列表(为什么? - False
并且任何事情都会导致错误,所以,为什么进一步检查?)如果不为空(即评估为True
),则返回list2
(为什么? - 如果第一个值为True
,则表达式的结果取决于第二个值,如果是False
,则表达式的计算结果为False
,否则为True
。),因此上述代码将变为if elem in list1
或if elem in list2
,具体取决于您的实施情况。这被称为短路。
有关Short Circuiting的Wiki页面可能是一个有用的读物。
示例 -
>>> list1 = [1, 2]
>>> list2 = [3, 4]
>>> list1 and list2
[3, 4]
>>> list1 = []
>>> list2 = [3, 4]
>>> list1 and list2
[]
答案 2 :(得分:3)
不,你不能。
list1 and list2
将返回第一个空列表(因为空列表被视为假值)或者如果所有列表都是非空的,则将使用最右侧的列表。
例如:
>>> [1] and [1,2,3]
[1, 2, 3]
>>> [1,2] and []
[]
>>> [] and []
[]
>>> [] and [1,2]
[]
>>> [1] and [] and [1,2]
[]
答案 3 :(得分:3)
不,但你可以把它写成:
{elem}.intersection (list1, list2)
答案 4 :(得分:1)
答案 5 :(得分:1)
对于有问题的代码示例,布尔运算符and
将返回其中一个测试值(Truth Value Testing),因此您将仅针对其中一个进行测试,但这并不能保证正确结果
>>> elem = 1
>>> list1 = [2, 3, 0]
>>> list2 = [1, 2, 3]
>>> if elem in (list1 and list2):
... print "IN"
...
>>> IN
答案 6 :(得分:0)
(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"
将给出“是”
答案 7 :(得分:0)
你可以这样做:
for item in list1:
if item in list2:
print item
答案 8 :(得分:0)
执行此操作的最短代码是通过添加它们然后检查将两个列表连接成一个,就像这样。
a = [1, 2, 3]
b = [4, 5, 6]
print(1 in a + b)
print(5 in a + b)
print(9 in a + b)
然而,这并不是非常有效,因为它会创建一个包含a
和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
答案 9 :(得分:0)
这里可以使用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")
答案 10 :(得分:0)
您可以使用列表推导式:
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 个列表中,这可能会派上用场。