如何检查元组或列表中的所有元素是否都在另一个元组或列表中?

11
例如,我想检查元组(1,2)中的每个元素是否都在元组(1,2,3,4,5)中。 我认为使用循环不是一个好方法,我认为可以在一行代码中完成。

2
元组是否已排序? - Peter Wood
你只是在询问 所有元素都是整数且按顺序排序的情况吗?(这样元组的顺序不重要了) 你想测试 (2,1) 是否在 (5,3,1,4,2) 中,返回 True 还是 False?能否请给出几个示例,并说明期望的输出值? - smci
如果所有元素都是连续整数,你可以使用像 slice 这样的数据结构,它只需要测试它的下界和上界 (start, stopstep),你甚至不需要一个元组/集合。或者使用 itertools.islice - smci
4个回答

23
你可以使用 set.issubsetset.issuperset 来检查一个元组或列表中的每个元素是否都在另一个元组或列表中。
>>> tuple1 = (1, 2)
>>> tuple2 = (1, 2, 3, 4, 5)
>>> set(tuple1).issubset(tuple2)
True
>>> set(tuple2).issuperset(tuple1)
True

6
我认为你需要这个:(使用all
>>> all(i in (1,2,3,4,5) for i in (1,2))
True 

0

鉴于您的问题特别针对元组/列表而不是集合,我会假设您包括元素重复且重复次数有关的情况。例如,(1, 1, 3)(0, 1, 1, 2, 3)中,但(1, 1, 3, 3)则不在其中。

import collections

def contains(l1, l2):
    l1_cnt = set(collections.Counter(l1).items())
    l2_cnt = set(collections.Counter(l2).items())

    return l2_cnt <= l1_cnt

# contains((0, 1, 2, 3, 4, 5), (1, 2)) returns True
# contains((0, 1, 1, 2, 3), (1, 1, 3)) returns True
# contains((0, 1, 1, 2, 3), (1, 1, 3, 3)) returns False

-2
另一个选择是在想不到集合时创建一个简单的函数。
def tuple_containment(a,b):
    ans = True
    for i in iter(b):
        ans &= i in a
    return ans

现在只需简单地测试它们。
>>> tuple_containment ((1,2,3,4,5), (1,2))
True
>>> tuple_containment ((1,2,3,4,5), (2,6))
False

我明确提到,我的意思是当“显而易见的事情没有想到”的时候。 - isopropylcyanide
tuple_checker 是做什么的?检查相等性、包含性,还是只是检查它们是否为元组? - Peter Wood

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