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

Eri*_*Lan 2 python set while-loop

刚开始学习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
Run Code Online (Sandbox Code Playgroud)

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

Reb*_*que 6

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

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

这是为什么:

  1. 集合是唯一对象的集合.
  2. x的元素集合是组成x的独特元素的集合.
  3. 因此,如果x仅由唯一元素组成,则x元素集的基数将等于构成x的元素的总数.

def has_unique_letters(x):
    return len(set(x)) == len(x)
Run Code Online (Sandbox Code Playgroud)

it returns True如果x仅包含唯一字母,则返回,False否则返回

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

如果pw中的大写和小写字母是等效的,则必须在处理之前将输入参数转换为较低(或较高)的大小写:

def has_unique_letters(x):
    lower_x = x.lower()
    return len(set(lower_x)) == len(lower_x)
Run Code Online (Sandbox Code Playgroud)

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

  • 你有一个缺少的括号:) (2认同)