确保每个字母仅在密码中出现一次

时间:2017-09-30 01:20:36

标签: python while-loop set

刚开始学习python并尝试使用循环编写代码来检查唯一字母,如下所示:

def has_unique_letters(x):
  count = 0
  letters = set(x)
  while count < len(x):
    if x[count] in letters:
       return False
    count += 1
  return True

但无论我在x中输入什么,它都会返回false。代码有什么问题?谢谢!

2 个答案:

答案 0 :(得分:6)

x的每个字母都将始终包含在set(letters of x)中,因此您的函数将始终返回False

要解决您的问题,您可以验证set(x)的长度是否等于x的长度:

这就是原因:

  1. 集合是唯一对象的集合。
  2. x的元素集合,是唯一的集合 组成x的元素。
  3. 因此,如果x仅由独特元素组成,则 x的元素集的基数将等于总数 组成x的元素数量。
  4. def has_unique_letters(x):
        return len(set(x)) == len(x)
    
    如果x仅包含唯一字母,则

    返回True,否则为False

    [编辑] - 关于对大写/小写的漠不关心的问题:

    如果上&amp; pw中的小写字母是等价的,在处理之前必须将输入参数转换为较低(或较高)的情况:

    def has_unique_letters(x):
        lower_x = x.lower()
        return len(set(lower_x)) == len(lower_x)
    

    [edit]在密码上放置一个唯一的字母约束会减少域空间;也许这不是一个好主意。

答案 1 :(得分:0)

这是另一种方法:

def has_unique_letters(string):
    return not bool([x for x in __import__('collections').Counter(string).values() if x > 1])