检查列表B中列表A的所有元素

时间:2017-07-07 08:06:58

标签: python

我完成了我的研究,但所有这些技术都归结为真,我需要它们返回假。

print set([2, 2]).issubset([2, 3, 3]) #returns True
print set([2, 3, 3]).issuperset(set([2, 2])) #returns True
print all(x in {2, 3, 3} for x in [2, 2]) #returns True
print set([2, 2]) <= set([2, 3, 3]) #returns True

我比较的列表有重复的数字

5 个答案:

答案 0 :(得分:3)

您可以在list.count功能中使用all

all(l1.count(i) <= l2.count(i) for i in set(l1))

对于l1中的每个元素,这将检查l2中是否存在至少一样的次数。 如果l1l2的任何元素出现次数较少,则all函数将返回False。 将l1转换为set可以防止当l1包含大量相同值时迭代次数增加。

测试:

>>> f = lambda l1, l2: all(l1.count(i) <= l2.count(i) for i in set(l1))
>>> f([2, 2], [2, 3, 3])
False
>>> f([2, 2], [2, 2, 3])
True

答案 1 :(得分:2)

我仍然不确定你真正在问什么。让我们一起去:

A = [2,2]
B = [2,3,3]

问题在于你是否可以通过在没有B替换的情况下选择A来制作A.也就是说,A中的项目不仅应该是B中的项目的子集,而且B中的项目必须至少与B中的项目一样多。在A.中有。

测试此方法的一种方法是使用collections.Counter

from collections import Counter
countsA = Counter(A)
countsB = Counter(B)
difference = countsA - countsB # any extra items in A
print difference, not difference

输出:Counter({2: 1}) False

如果集合包含任何内容,则它们都是真的,我们可以根据您要求的False值来否定它。这种差异也可用于准确显示A中哪些物品无法从B中取出,在这种情况下是物品2的1个计数。

答案 2 :(得分:1)

这个怎么样:

a = [2, 2]
b = [2, 3, 3]

from collections import Counter as cC

fa = cC(a)
print(fa)  # Counter({2: 2})
fb = cC(b)
print(fb)  # Counter({3: 2, 2: 1})

test = all(fa[entry] <= fb.get(entry, -1e+30) for entry in fa)

print(test)  # False

或者根据@ChrisRand在评论中所说的:

test = fa - fb == {}
print(test)  # False

答案 3 :(得分:0)

只需查看multiset的实施。它应该通过(大部分)您的测试用例。

答案 4 :(得分:0)

python函数的数学答案是正确的。看来你也想检查一下元素的数量。因此,用户定义的函数看起来像

def compare(listsuper,listsub):
   stat=None
   for element in listsuper:
       if listsuper.count(element)==listsub.count(element):
          pass
       else:
          stat=False
   if stat==None:
       for element in listsub:
           if element in listsub and element in listsuper:
               pass
           else:
               stat=False
   if stat==None:
       stat=True
   return stat
print compare([2,3,3],[2, 2])

希望此功能可以按您的需要运行