如何检查 Python 列表是否包含另一个列表的重复项未忽略的元素

How to Check if Python List Contains Elements of Another List Duplicates Not Ignored

我正在尝试检查一个小列表是否包含另一个更大列表中存在的所有数字 案例 1:- list1:[97,97,196] 清单 2:[97,97,101,103,196]

案例 2:- 列表 1:[97,97,196] 清单 2:[97,101,103,196]

list1 = [97,97,196]
list2 = [97,97,99,101,103,196]


def isConsist(list1,list2):
    check = False

    # Iterate in the 1st list
    for m in list1:

        # Iterate in the 2nd list
        for n in list2:

            # if there is a match
            if m == n:
                check = True
                list2.remove(n) // remove the found element 
            else:
                check = False
                return False
    return check

check = isConsist(list1,list2)
print(check)


这是我的代码,但无法正常工作

我的代码得到了我的错误,因为当它检查第一个列表中的 196 时,它将它与第二个列表中的 99 比较,然后它 returns False

使用一个collections.Counter对象,它可以像多重集一样使用。本质上,您是在询问 list1 创建的多重集在与列表 2 的多重集相差之后是否为空。因此请考虑:

>>> from collections import Counter
>>> list1 = [97,97,196]
>>> list2 = [97,97,101,103,196]
>>> Counter(list1) - Counter(list2)
Counter()

但如果我们这样做:

>>> list2 = [97,101,103,196]
>>> Counter(list1) - Counter(list2)
Counter({97: 1})

注意,以上是线性时间,space.

另一种从高层次思考这个问题的方法:

  1. 使用字典对 list1 中的对象进行计数,调用 counts1
  2. 使用字典对 list2 中的对象进行计数,调用 counts2
  3. 从匹配键的 count1 中的计数中减去 count2 中的计数
  4. 如果所有计数都为 0 或负数,则结果为真,否则为假。

总结起来,您的函数因此可以写成:

from collections import Counter

def is_consistent(list1, list2):
    return bool(Counter(list1) - Counter(list2))

编辑:

刚刚发现这一点,但是自 Python 3.10 起,collections.Counter class 现在支持丰富的比较运算符用于多重集相等、子集和超集关系!

所以你实际上可以使用:

def is_consistent(list1, list2):
    return Counter(list1) <= Counter(list2)

请注意,如果仅用于说明目的,您可以使用常规词典“手动”执行此操作:

def _count(lst):
    counts = {}
    for item in lst:
        counts[item] = counts.get(item, 0) + 1
    return counts

def is_consistent(list1, list2):
    counts1 = _count(list1)
    counts2 = _count(list2)
    for k in counts1:
        counts1[k] -= counts2.get(k, 0)
    for v in counts1.values():
        if v > 0:
            return False
    return True

现在,如果正如您指出的那样,您 不 return早。这是我认为您想要达到的目的:

def is_consistent(list1, list2):
    list1_copy = list1.copy()
    for item in list2:
        if item in list1:
            try:
                list1_copy.remove(item)
            except ValueError:
                pass
    return bool(list1_copy)

注意,bool(list1_copy)等同于len(list1_copy) == 0

嘿嘿!! 这是我的解决方案: 首先,让我们检查第一个列表是否是第二个列表的子列表,因为如果不是,继续下去就没有任何意义。 然后我正在做的是只在第一个列表中迭代并检查两个列表中是否恰好有 n-occourences 那个数字,如果这是 False,return False,否则如果一切都很好Return 正确

def isConsist(list1, list2):

# check if all the element in list1 are in list2
x = set(list1)
y = set(list2)
if not x.issubset(y):
    return False

# Iterate in the 1st list
for n1 in range(len(list1)):

    if list1.count(list1[n1]) != list2.count((list1[n1])):
        return False

return True

print(isConsist(list1, list2))

您可以尝试这样的操作

list1 = [97,97,196] 
list2 = [97,101,103,196]
[list1.remove(i) for i in list2 if i in list1]
print(bool(list1))

将列表转换为集合并不能解决您的问题。最好的方法是使用collections.Counter。这是我的代码:

from collections import Counter

list1 = [97, 97, 196]
list2 = [97, 97, 99, 101, 103, 196]


def consist(a, b):
    a_count = Counter(a)
    b_count = Counter(b)
    for key in a_count:
        if key not in b_count:
            return False
        if b_count[key] > a_count[key] or a_count[key] > b_count[key]:
            return False
    return True


print(consist(list1, list2))

这里,在第一个 if 条件下,我们正在检查 list1 中的元素是否存在于 list2 中。在第二个 if 条件中,我们检查 list1 中的元素计数是否与 list2 中的元素计数相同。

这是我得到的最佳答案。希望对您有所帮助..:)