【问题标题】:Check if all elements in list1 exist in list2 python [duplicate]检查list1中的所有元素是否存在于list2 python中[重复]
【发布时间】:2016-03-10 08:51:48
【问题描述】:

我希望能够找到 list1 中的所有元素是否都存在于 list2 中,两个列表都包含字符。相同元素在每个列表中出现的次数很重要。

我尝试使用子集,但没有记录项目在列表中出现的次数

例如

list1 = [a, b, c]
list2 = [a, b, c, b]

它会发现 list2 是 list1 的一个子集,而我只希望我的函数在以下情况下执行:

list1 = [a, b, c, b, i]
list2 = [a, c, b, b]

因为这意味着 list2 中的所有项都出现在 list1 中。

如果有人感兴趣,使用计数器对于大字符串来说效率很低,所以我最终将 list1 的所有元素添加到字典中,值是每个元素的出现次数并减去 list2 的所有元素。如果任何值最终为负数,则并非 list2 中的所有项目都出现在 list1 中

【问题讨论】:

标签: python list python-3.x subset


【解决方案1】:

您可以使用 collections.Counter 计算两个列表中的项目,并检查第一个列表中相应项目的计数是否 >= 比第二个列表中的计数:

>>> from collections import Counter
>>> c = Counter("abcbi")
>>> d = Counter("acbb")
>>> c.subtract(d)
>>> if all(v >= 0 for k, v in c.items()):
...     print("All items exist")
... 
All items exist

【讨论】:

  • 这个很好,之前我不知道subtract!我认为我们有一个赢家。
  • 这种方法有效,但是如果计数器的字符串很大,则效率非常低
【解决方案2】:

您可以使用collections.Counter

from collections import Counter
list1 = ['a', 'b', 'c']
list2 = ['a', 'b', 'c', 'b']    
c1 = Counter(list1)
c2 = Counter(list2)

for key, count in c1.iteritems():
    if c2[key] < count:
        break
else:
    print 'list2 has all the chracters in list1'

【讨论】:

    【解决方案3】:

    对于你的问题,你需要

    1. 验证list2 中的所有元素是否出现在list1
    2. list2 中没有元素比list2 中出现的频率更高

    使用collections.Counter 可以很容易地做到这一点:

    import collections
    
    def f(list1, list2):
        d1 = collections.Counter(list1)
        d2 = collections.Counter(list2)
        return set(d1.keys()).issuperset(set(d2.keys())) \
           and all(d2[k] <= d1[k] for k in d1.keys())
    

    首先检查(使用set.issupersetlist2 的所有不同元素是否包含在list1 中。如果这是真的,它会检查每个元素在list2 中出现的频率,并验证它在list1 中出现的频率是否较低(或相同频率)。

    【讨论】:

    • 这是“eugene y”所写内容的更详细的版本,如果可能的话,我宁愿使用他的版本而不是我的版本。
    【解决方案4】:

    你可以使用issuperset:

    >>> list1 = ['a', 'b', 'c', 'b', 'i']
    >>> list2 = ['a', 'c', 'b', 'b']
    >>> set(list1).issuperset(set(list2)) # all items of list2 exist in list1
    True
    >>> set(list2).issuperset(set(list1)) # all items of list1 does not exist in list 2
    False
    

    【讨论】:

    • 我尝试使用子集,但是没有注意到列表中出现的次数项目
    • 从问题陈述来看,这对我来说是正确的答案
    • 这与我所看到的没有什么不同。它不承认列表中的项目频率
    • 再次,根据您在问题中的陈述,这就是您“想要的”。如果您更清楚,我们可以给您更好的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 2020-11-12
    • 2018-07-07
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多