检查字典是否是另一个字典的子集
我试图比较2个字符串并检查字符串a
中的所有字符是否存在于字符串b
中。我目前使用以下方法将字符串转换为字典并与其他字符进行比较。但是它有很多机会让人产生误解。检查字典是否是另一个字典的子集
x = 'NJITZU THE HANDS OF TIME'
y = 'NinjaGo Masters of Spinjitzu The Hands of Time'
if Counter(x) < Counter(y):
print 'Yes'
else:
print 'No'
请提出更好的办法来做到这一点
如果我正确理解你的问题,你不需要比较字典,但集:
>>> x = 'NJITZU THE HANDS OF TIME'
>>> y = 'NinjaGo Masters of Spinjitzu The Hands of Time'
>>> set(x).issubset(set(y))
False
如果你想有一个不区分大小写的比较,你可以在两个字符串调用lower()
:
>>> set(x.lower()).issubset(set(y.lower()))
True
你也可以通过使用split()
比较完整的词:
>>> set(x.lower().split())
set(['of', 'the', 'time', 'njitzu', 'hands'])
>>> set(x.lower().split()).issubset(set(y.lower().split()))
False
>>> set('SPINJITZU THE HANDS OF TIME'.lower().split()).issubset(set(y.lower().split()))
True
我会使用set
对象。 Documentation can be found here.
x = 'NJITZU THE HANDS OF TIME'
y = 'NinjaGo Masters of Spinjitzu The Hands of Time'
if set(x.lower()) <= set(y.lower()):
print('Yes')
else:
print('No')
的<
操作符被重载以is_subset
。要获得打印“是”的答案,我还将字符串转换为小写字母。
您可以使用内建的all函数。
all(character in y for character in x)
如果每个元素都为真,则all()将返回true,否则返回false。我们使用in
来检查一个字符是否在字符串y
中,我们将为每个character in x
执行此操作。
这工作正常,是非常可读的。不过,它比使用套件效率低得多。 –
我想知道,numpy all()的性能与set相比如何? – Metropolis
问题是,你必须为每个'x'中的字符调用'y'中的字符,并且一次又一次解析整个'y'字符串是昂贵的。使用另一个'all()'不应该改变'O(n * m)'的复杂性。有了集合,复杂性应该是'O(n + m)'。 –
只能说明我可能会添加的是,OP是否想要包含空格字符还不清楚。 –