检查集合中是否存在任何值

6
假设我有以下集合:
things = {'foo', 'bar', 'baz'}

我想找出集合中是否存在foo 或者 bar。我已经尝试过:

>>> 'foo' in things or 'bar' in things
True

这个代码可以运行,但有没有更符合Python风格的方式来进行这个检查而不必使用多个or语句?我在标准Python集合操作中找不到任何可以实现此目的的选项。 使用 {'foo','bar'} <= things 可以检查两者是否都存在,但我想检查它们中的任何一个。
5个回答

7
只要你使用集合,你可以使用以下代码:
if {'foo','bar'} & things:
    ...

& 表示集合的交,并且只有在交集非空时,交集才是真实的。


6

谈论集合时,您实际上想知道的是交集是否非空:

if things & {'foo', 'bar'}:
    # At least one of them is in

而且总是有任何(any()):

any(t in things for t in ['foo', 'bar'])

如果你有很长的待检查列表,那么这很不错。但对于只有两件事情的情况,我更喜欢简单的or


5

您正在寻找这些集合的交集:

things = {'foo', 'bar', 'baz'}

things.intersection({'foo', 'other'})
# {'foo'}

things.intersection('none', 'here')
#set

所以,在布尔上下文中,空集是假的,你可以这样做:

if things.intersection({'foo', 'other'}):
    print("some common value")
else:
    print('no one here')

4
您可以使用set.isdisjoint
if not things.isdisjoint({'foo', 'bar'}):
    ...

或者 set.intersection

if things.intersection({'foo', 'bar'}):
    ...

或者任意

if any(thing in things for thing in ['foo', 'bar']):
    ...

或者坚持使用or,因为很多时候这实际上是最易读的解决方案:

if 'foo' in things or 'bar' in things:
    ...

2
things = {'foo', 'bar', 'baz'}
any([i in things for i in ['foo', 'bar']])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接