我完成了我的研究,但所有这些技术都归结为真,我需要它们返回假。
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
我比较的列表有重复的数字
答案 0 :(得分:3)
您可以在list.count
功能中使用all
:
all(l1.count(i) <= l2.count(i) for i in set(l1))
对于l1
中的每个元素,这将检查l2
中是否存在至少一样的次数。
如果l1
中l2
的任何元素出现次数较少,则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])
希望此功能可以按您的需要运行