繁体   English   中英

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

[英]Check if ALL elements of list A within list B

我已经完成了研究,但是所有这些技术都返回true,我需要它们返回false。

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

我比较的清单有重复的数字

您可以在all函数内部使用list.count

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

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

测试:

>>> 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

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

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

问题是,是否可以通过选择而不替换B来制造A。也就是说,不仅A中的项目应该是B中项目的子集,而且B中的每个项目必须至少与B中的项目一样多。一种。

一种测试方法是使用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

由于集合包含任何内容都为true,因此我们可以将其取为您要求的False值。 这种差异也可以用来准确显示A中哪些项目不能从B中取出,在这种情况下,项目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

只是寻找multiset的实现。 它应该通过(大多数)测试用例。

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])

希望此功能可以按需工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM