![](/img/trans.png)
[英]How can I check how often all list elements from a list B occur in a list 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.