【问题标题】:Return True if alphanumeric (No methods or import allowed)如果是字母数字则返回 True(不允许方法或导入)
【发布时间】:2013-06-07 23:24:20
【问题描述】:

当且仅当输入的是字母数字(仅包含字母或数字)而不使用方法或导入时,使函数返回 True 的好方法是什么?

到目前为止,我们在课堂上只介绍了boolswhile 循环和if-语句,并且只允许使用我们所学的内容。

这就是我得到的

def alphanumeric(s):
    i = 0
    while i < len(s):
        if s[i] == 1 or s[i] == 2 or s[i] == 3.....:
            i = i + 1
            return True
        else:
            return False

有没有更简洁的方法可以在不使用方法或导入的情况下做到这一点? 我所拥有的不起作用,无论我输入什么都返回 False。

已解决。感谢所有提供帮助的人!

【问题讨论】:

  • 我只能使用 bool、while 循环和 if 语句。

标签: python if-statement python-3.x while-loop boolean


【解决方案1】:

您误解了==or 的工作原理。您需要分别测试每个字符:

if s[i] == 1 or s[i] == 2 or s[i] == 3 ...:

或使用in 测试:

if s[i] in (1, 2, 3, 4, ...):

除了你在这里测试字符,而不是整数,所以要么把你的字符变成整数,要么测试数字:

if int(s[i]) in (1, 2, 3, 4, ...):

if s[i] in '1234567890':

后者之所以有效,是因为字符串也是序列;测试一个字符是否在字符串'1234567890' 中也是一个有效的成员测试。

由于字符串是序列,你也可以直接循环它们:

for char in s:
    if char in '1234567890':

无需在那里使用while 循环和计数器。

这仍然只测试数字;要测试字母,你可以做以下两件事之一:

  • 使用string模块,它有ascii_lettersdigits属性:

    import string
    
    for char in s:
        if char in string.ascii_letters + string.digits:
    
  • 或测试字符是否在两个已知字符之间:

    if 'a' <= char <= 'z' or 'A' <= char <= 'Z' or '0' <= char <= '9':
    

    这是有效的,因为字符串是可比较和可排序的;它们根据它们在 ASCII 码表中的位置而变小或变大。

你的下一个问题是你返回True 太早了;您为第一个匹配项执行此操作,但您需要测试 所有 个字符。如果您没有发现任何遗漏,请仅返回 True

for char in s:
    if char not in string.ascii_letters + string.digits:
        return False

return True

现在我们测试所有字符,为第一个非字母数字字符返回False,但只有在循环完成后,我们才返回True

【讨论】:

  • 表达式需要比较字符串。 s[i]=='1' 等
  • 感谢您的帮助! :)
  • 问题是“我们只涉及布尔、while 循环和 if 语句,并且只允许使用我们所学的内容”。所以我认为需要使用while 循环和计数器而不是for 循环。 (可能还需要一位了解for 循环对于新手来说更容易理解的老师,即使while 循环对于迁移到 Python 的 C 专家来说更容易......)
  • @abarnert:我觉得不受该列表的限制;它可能不完整,我的目标是在这些答案中教一些东西。
  • 啊!我遇到的一个问题。如果这些特殊字符(*、#、~、- 等)嵌入到字符串中间的某个位置,则此函数由于某种原因无法捕获这些字符。
【解决方案2】:

您可以使用 Python 比较运算符来测试字符,因此您可以执行以下操作:

def is_alphanumeric(s):
  for ch in s:
    if not ('a' <= ch <= 'z' or 'A' <= ch <= 'Z' or '0' <= ch <= '9'):
      return False
  return True

这将遍历字符串中的每个字符,并查看它是否介于 'a' 和 'z' 或 'A' 和 'Z' 或 '0' 和 '9' 之间。

【讨论】:

  • 谢谢!这正是我想知道的。
【解决方案3】:

假设 "no methods allowed" 意味着没有 regex 或类似的东西,你可以使用这个。

如果您必须手动写出string.digitsascii_letters,我会留给您;)(这是个玩笑,如果您不被允许@,您实际上可以使用@mipadi 的方法987654323@)

from string import digits, ascii_letters as alphabet
valid = digits + alphabet
def alphanumeric(s):
    return all(c in valid for c in s)


>>> alphanumeric('1a')
True
>>> alphanumeric('_')
False

相当于:

def alphanumeric(s):
    for c in s:
        if c not in valid:
            return False
    else:
        return True

【讨论】:

  • 字母远比ASCII字母多!
  • @abarnert ikegami 暗示 OP 应该这样做
  • @jamylak:OP 应该做什么?输入数千行的 Unicode 类数据?我想这是让他的老师相信他是个聪明人的好方法,但除此之外,为什么呢?
  • 你为什么决定任意排除一个字母而不是另一个。你没有记录你反复无常的决定。我的名字是美国男孩最常取的名字之一,但你决定它的一个拼写不是由字母组成而没有提及它。
【解决方案4】:

您可以使用in 运算符并遍历输入字符串s

for c in s:
    if c not in 'abcdefABC123':

以标志True 开头,如果有任何字符违反字母数字要求,则将其设置为False

【讨论】:

    【解决方案5】:

    首先,我假设 s 是一个字符串。

    所以你必须做s[i] == '1',因为s[i]是一个子字符串而不是一个整数。

    这就是你的函数总是返回 False 的原因。 然后只有在查看第一个字符后才返回 true 或 false,您必须测试每个字符,直到一个字符不是字母数字或直到结尾。

    def alphanumeric(s):
        i = 0
        flag = True
        char = 'a...zA...Z0..9'
        charLen = len(char)
        while (i < len(s) and flag) :
            subflag = False
            charIndex = 0
            while charIndex < charLen:
                subflag = subflag or (s[i] == char[charIndex])
                charIndex += 1 # Equivalent of charIndex = charIndex + 1
            flag = flag and subflag
            i = i +1
        return flag
    

    【讨论】:

      【解决方案6】:

      一些建议:

      首先,当您看到一个字母数字字符时,您尝试返回 True - 您需要在返回 True 之前检查 所有 个字符(尽管您可以在看到单个非字符时返回 False字母数字字符)。

      其次,如果s是一个字符串,s[i]是一个字符(即'1',而不是1)。

      第三,你写的时候

      if s[i] == 1 or 2 or 3
      

      您正在评估 (s[i] == 1),然后将 2 本身作为布尔值(始终为假)等。要将 s[i] 与每个进行比较,您需要

      if s[i] == '1' or s[i] == '2' or s[i] == '3'
      

      或者,更简洁地说,

      if s[i] in ['1', '2', '3', ...]
      

      【讨论】:

      • BBrown 是正确的 - 你也可以使用 if s[i] in '123456...'
      【解决方案7】:
      def isAlphaNumeric(myString):
          return not any((c for c in myString if not c in "abcdef...ABC...123"))
      

      【讨论】:

        猜你喜欢
        • 2015-07-17
        • 2018-10-22
        • 1970-01-01
        • 1970-01-01
        • 2018-07-08
        • 2017-02-28
        • 1970-01-01
        • 2022-12-04
        • 2020-09-18
        相关资源
        最近更新 更多