检查字典是否是另一个字典的子集

问题描述:

我试图比较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 
+1

只能说明我可能会添加的是,OP是否想要包含空格字符还不清楚。 –

我会使用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执行此操作。

+0

这工作正常,是非常可读的。不过,它比使用套件效率低得多。 –

+0

我想知道,numpy all()的性能与set相比如何? – Metropolis

+2

问题是,你必须为每个'x'中的字符调用'y'中的字符,并且一次又一次解析整个'y'字符串是昂贵的。使用另一个'all()'不应该改变'O(n * m)'的复杂性。有了集合,复杂性应该是'O(n + m)'。 –