python 如何检查以下所有项目是否都在列表中?

ndasle7k  于 2023-02-11  发布在  Python
关注(0)|答案(8)|浏览(117)

我发现,有一个相关的问题,关于如何找到,如果至少有一个项目存在于一个列表:
How to check if one of the following items is in a list?
但是,什么是最好的和Python的方式来寻找是否所有的项目都存在于一个列表中?
通过搜索文档,我发现这个解决方案:

>>> l = ['a', 'b', 'c']
>>> set(['a', 'b']) <= set(l)
True
>>> set(['a', 'x']) <= set(l)
False

其他解决方案可能是:

>>> l = ['a', 'b', 'c']
>>> all(x in l for x in ['a', 'b'])
True
>>> all(x in l for x in ['a', 'x'])
False

但是在这里你必须多打字。
有没有其他的解决办法?

lqfhib0f

lqfhib0f1#

像Python中的<=这样的运算符通常不会被覆盖,表示与“未来或等于”有很大不同的含义。标准库这样做是不寻常的--我觉得它有点像遗留API。
使用等效的、名称更清楚的方法set.issubset。注意,不需要将参数转换为集合;如果需要的话它会帮你的。

set(['a', 'b']).issubset(['a', 'b', 'c'])
sycxhyv7

sycxhyv72#

我可能会按以下方式使用set

set(l).issuperset(set(['a','b']))

或者反过来说:

set(['a','b']).issubset(set(l))

我发现它更容易阅读,但是可能有点过头了。集合对于计算集合之间的并集/交集/差特别有用,但是在这种情况下它可能不是最好的选择...

omvjsjqw

omvjsjqw3#

我喜欢这两个,因为它们看起来最符合逻辑,后者更短,而且可能更快(这里使用的是set字面语法,它已经被移植到Python 2.7):

all(x in {'a', 'b', 'c'} for x in ['a', 'b'])
#   or
{'a', 'b'}.issubset({'a', 'b', 'c'})
hsgswve4

hsgswve44#

如果您的列表中包含重复项,该怎么办:

v1 = ['s', 'h', 'e', 'e', 'p']
v2 = ['s', 's', 'h']

集合不包含重复项。因此,下面的行返回True。

set(v2).issubset(v1)

要计算重复项,可以使用以下代码:

v1 = sorted(v1)
v2 = sorted(v2)

def is_subseq(v2, v1):
    """Check whether v2 is a subsequence of v1."""
    it = iter(v1)
    return all(c in it for c in v2)

因此,下面的行返回False。

is_subseq(v2, v1)
mkh04yzy

mkh04yzy5#

OP的情况不是这样,但是--对于任何想要Assert交集in dicts 并由于糟糕的谷歌搜索而最终到达这里的人(例如我)--您需要使用dict.items

>>> a = {'key': 'value'}
>>> b = {'key': 'value', 'extra_key': 'extra_value'}
>>> all(item in a.items() for item in b.items())
True
>>> all(item in b.items() for item in a.items())
False

这是因为dict.items返回键/值对的元组,就像Python中的任何对象一样,它们可以互换

tvokkenx

tvokkenx6#

另一种解决办法是:

l = ['a', 'b', 'c']
potential_subset1 = ['a', 'b']
potential_subset2 = ['a', 'x']
print(False not in [i in l for i in potential_subset1]) # True
print(False not in [i in l for i in potential_subset2]) # False

我的解决方案之所以出色,是因为您可以通过内联列表来编写一行程序。

nhhxz33t

nhhxz33t7#

使用lambda表达式执行此操作的示例如下:

issublist = lambda x, y: 0 in [_ in x for _ in y]
fzsnzjdm

fzsnzjdm8#

短语法

我在试验Python解释器时发现了一种可读性很强的语法。

>>> my_list = [1, 2, 3, 4, 5]
>>> (6 or 7) in my_list
False
>>> (2 or 6) in my_list
True
>>> (2 and 6) in my_list
False
>>> (2 and 5) in my_list
True

要搜索的项目列表

如果要搜索的对象列表很长,保存在sub_list变量中:

>>> my_list = [1, 2, 3, 4, 5]
>>> sub_list = ['x', 'y']

如果超集中包含任何(至少一个)项(or语句):

>>> next((True for item in sub_list if next((True for x in my_list if x == item), False)), False)
False

>>> sub_list[0] = 3
>>> next((True for item in sub_list if next((True for x in my_list if x == item), False)), False)
True

如果所有的元素都包含在超集中(and语句),那么sub_list就是一个完整的子集。

>>> next((False for item in sub_list if item not in my_list), True)
False

>>> sub_list[1] = 2
>>> next((False for item in sub_list if item not in my_list), True)
True
>>> next((True for item in sub_list if next((True for x in my_list if x == item), False)), False)
True

相关问题