为什么这个Python Dict代码有效?

时间:2014-10-01 05:17:52

标签: python python-2.7 dictionary

def isPerm(s1, s2):
    if len(s1) != len(s2):
        return False
    a = dict()
    for char in s1:
        a[char] = True
    for char2 in s2:
        if a.get(char2) == True:
            continue
        else: return False
    return True

这是我写的一个函数,用于查找两个字符串是否相互排列。 但是当我通过它推理时,我不确定为什么这会起作用(我得到了正确的输出)。根据我的知识,dict就像一个哈希表。

例如,如果我有s1和s2为“ab”和“aab”,这应该给我False,这个功能就是这样。现在,在第一个for循环中,当我转到s1中的每个char时,我有一个dict,其中“a”和“b”映射为True。

当我转到第二个for循环时,我检查“a”的dict值并且它是True,所以我继续。在第二个字符中,我再次得到一个“a”,这是真的,在第三个迭代中,“b”也给了我真实。所以,该函数应该给我True,但它给了我假。我很困惑为什么它有效!

2 个答案:

答案 0 :(得分:1)

你的程序有效,因为它返回False,因为在函数中检查了第一个条件。

if len(s1) != len(s2):
    return False

由于abaab的大小不同,因此会立即失败。

但是,作为inspectorG4dget points out,您的计划将因输入aababb而失败。

要实际找出一个字符串是否是另一个字符串的排列,您应该计算每个字符在两个字符串中出现的次数,如果所有计数都相等,则返回True。这可以在collections.Counter的帮助下在Python中完成,就像这样

from collections import Counter
def isPerm(s1, s2):
   return Counter(s1) == Counter(s2)

collections.Counter为您提供字符及其相应计数的字典。例如,

>>> from collections import Counter
>>> Counter("aab")
Counter({'a': 2, 'b': 1})
>>> Counter("abb")
Counter({'b': 2, 'a': 1})
>>> Counter("aab") == Counter("abb")
False
>>> Counter("aab") == Counter("aba")
True

使用普通词典的另一种方法,

def counter(s):
    d = {}
    for char in s:
        d[char] = d.get(char, 0) + 1
    return d

def isPerm(s1, s2):
    return counter(s1) == counter(s2)

assert isPerm("aab", "aba") == True
assert isPerm("aab", "abb") == False

答案 1 :(得分:1)

检查排列的代码解决方案更加简单。它也是O(nlogn)复杂性。只需对字符串进行排序并比较结果。

def isPerm(s1, s2):
    return sorted(s1) == sorted(s2)