如何在python中优化此代码

时间:2017-07-02 14:59:51

标签: python dictionary optimization iterator generator

我需要优化此代码,基本上检查s1中是否包含字符串s2的每个字符,并考虑到双倍。

s1, s2 = list(s1), list(s2)
for s in s2:
    if s in s1:
        s1.remove(s)
    else:
        return False
return True

我对map,迭代器和生成器做了一些研究,我确信其中一个或多个有一个解决方案,但是现在我很困惑和沮丧(我很新到python,只需几周),所以也许你可以帮我理解这种情况下最好的策略。谢谢!

3 个答案:

答案 0 :(得分:3)

使用Counter正确处理重复字符的解决方案:

from collections import Counter
c1 = Counter(s1)
c2 = Counter(s2)
return all(c2[c]>=c1[c] for c in c1)

答案 1 :(得分:1)

您可以计算两个字符串中每个字符的出现次数。您也不需要将任何一个字符串作为列表:字符串是它们自己的迭代器。

首先,创建set,因为集合的平均查找次数为O(1)。 然后,遍历集合并获取每个字符的计数。如果任何计数不相等,return False。随着字符串大小的增长,它也会比当前的解决方案更好地扩展:

s1 = 'Stack Overflow'
s2 = 'woltk fcrSeavO'

def equal_chars(s1, s2):
    chars = set(s2)
    for char in chars:
        if s1.count(char)!= s2.count(char):
            return False
    return True

print(equal_chars(s1, s2))

答案 2 :(得分:0)

稍微调整一下阿德里安的优秀答案(可能?)效率更高:

from collections import Counter

s1 = "hello"
s2 = "helo"

def count_chars(s1,s2):
    c2 = Counter(s2)
    for k,v in Counter(s1).items():
        if c2[k] < v:
            return False
    return True

print (count_chars(s1,s2))

结果:

False